linkmore-design
Version:
🌈 🚀lm组件库。🚀
141 lines (131 loc) • 5.75 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _classnames = _interopRequireDefault(require("classnames"));
var _react = _interopRequireWildcard(require("react"));
var _button = _interopRequireDefault(require("../../button"));
var _checkbox = _interopRequireDefault(require("../../checkbox"));
var _virtualList = _interopRequireDefault(require("../../virtual-list"));
var _empty = _interopRequireDefault(require("../../empty"));
var _hooks = require("../hooks");
var _utils = require("../utils");
var _DelayInput = _interopRequireDefault(require("./DelayInput"));
const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? _react.useLayoutEffect : _react.useEffect;
const CheckboxFilter = props => {
const {
value = [],
onChange,
onCancel,
options: filters = [],
showSearch,
showAllChecked,
locale = {}
} = props;
const inputRef = (0, _react.useRef)(null);
// 选中的数据项: [key, key, ...];
const [checkedValues, setCheckedValues] = (0, _react.useState)(value);
// 选中的数据的键
// const checkedKeys = useMemo(() => checkedValues.map(v => v), [checkedValues]);
// 搜索后的筛选项
const [options, setOptions] = (0, _react.useState)(filters);
const delayedFn = (0, _hooks.useDelayedFn)();
// 是否存在搜索, 当数据大于8时存在搜索
const isSearch = (0, _react.useMemo)(() => filters.length > 8 && !!(showSearch ?? true), [filters.length, showSearch]);
const isAllCheck = (0, _react.useMemo)(() => !!(showAllChecked ?? true), [showAllChecked]);
// 是否全选: 选中的数据大于等于筛选后的数据 && 筛选后的数据全部存在于选中的数据中
const checkAll = (0, _react.useMemo)(() => {
const isAll = checkedValues.length >= options.length;
return isAll && options.every(({
value
}) => checkedValues.some(v => v === value));
}, [checkedValues, options]);
// 是否半选: 存在选中的数据 && 未全选
const indeterminate = (0, _react.useMemo)(() => checkedValues.length && !checkAll, [checkedValues.length, checkAll]);
// 搜索
const handleFilter = (val = '') => {
const serachValues = filters.filter(v => v.label.indexOf(val) > -1);
setOptions(serachValues);
};
// 单选事件
const handleOnClick = (e, item) => {
e.preventDefault();
const nValue = checkedValues.some(value => value === item.value) ? checkedValues.filter(value => value !== item.value) : (0, _utils.uniqueFunc)([...checkedValues, item.value], 'value');
setCheckedValues(nValue);
};
// 全选事件
const onCheckAllChange = () => {
const nValue = checkAll ? checkedValues.filter(value => !options.some(v => v.value === value)) : (0, _utils.uniqueFunc)([...checkedValues, ...options.map(({
value
}) => value)], 'value');
setCheckedValues(nValue);
};
// 确定 执行查询操作
const handleSure = () => {
onChange?.(checkedValues);
};
// 展开下拉时触发: 赋值 && 聚焦 && 重置显示内容
useIsomorphicLayoutEffect(() => {
delayedFn(() => inputRef.current && inputRef.current?.focus({
cursor: 'all'
}));
// 若开启了 Dropdown => destroyPopupOnHide=true 无需重置操作 反之需开启
// setCheckedValues(value);
// inputRef.current?.setValue?.('');
// handleFilter('');
}, []);
return /*#__PURE__*/_react.default.createElement("div", {
className: "filter_dropdown"
}, isSearch && /*#__PURE__*/_react.default.createElement("div", {
className: "filter_header"
}, /*#__PURE__*/_react.default.createElement(_DelayInput.default, {
ref: inputRef,
onSearch: handleFilter,
onChange: handleFilter
}), isAllCheck && /*#__PURE__*/_react.default.createElement("div", {
className: "filter_header_operate"
}, /*#__PURE__*/_react.default.createElement(_checkbox.default, {
indeterminate: indeterminate,
onChange: onCheckAllChange,
checked: checkAll,
className: "filter_tip"
}, locale.all), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("span", {
className: "filter_tip"
}, locale.selected, ": ", checkedValues.length)))), /*#__PURE__*/_react.default.createElement(_checkbox.default.Group, {
value: checkedValues,
className: "filter_body"
}, /*#__PURE__*/_react.default.createElement(_virtualList.default, {
options: options,
className: "filter_list"
}, ({
item,
...resetProps
}) => {
return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, resetProps, {
className: (0, _classnames.default)('filter_item', {
checked: checkedValues.some(value => value === item.value)
}),
onClick: e => handleOnClick(e, item)
}), /*#__PURE__*/_react.default.createElement(_checkbox.default, {
value: item.value,
className: "filter_item_content"
}, item.label));
}), !options.length && /*#__PURE__*/_react.default.createElement(_empty.default, {
title: ""
})), /*#__PURE__*/_react.default.createElement("div", {
className: "filter_footer"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "footer_clear",
onClick: onCancel
}, locale.cancel), /*#__PURE__*/_react.default.createElement(_button.default, {
type: "primary",
size: "small",
onClick: handleSure
}, locale.ok)));
};
var _default = CheckboxFilter;
exports.default = _default;