linkmore-design
Version:
🌈 🚀lm组件库。🚀
180 lines (170 loc) • 7.06 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
var _excluded = ["item"];
import React, { useRef, useState, useMemo, useEffect, useLayoutEffect } from 'react';
import cn from 'classnames';
import Button from "../../button";
import VirtualList from "../../virtual-list";
import Checkbox from "../../checkbox";
import InputSearchClose from "./InputSearchClose";
import EmptyFilter from "./EmptyFilter";
import { uniqueFunc } from "../utils";
import { useDelayedFn } from "../hooks";
var useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
var CheckboxFilter = function CheckboxFilter(_ref) {
var instance = _ref.instance,
itemProps = _ref.item;
var _instance$filterValue = instance.filterValue,
filterValue = _instance$filterValue === void 0 ? [] : _instance$filterValue,
setFilterValue = instance.setFilterValue,
visible = instance.visible,
setVisible = instance.setVisible,
locale = instance.locale;
var _itemProps$data = itemProps.data,
filters = _itemProps$data === void 0 ? [] : _itemProps$data,
showSearch = itemProps.showSearch,
showAllChecked = itemProps.showAllChecked;
var inputRef = useRef(null);
// 选中的数据项: [key, key, ...];
var _useState = useState(filterValue),
_useState2 = _slicedToArray(_useState, 2),
checkedValues = _useState2[0],
setCheckedValues = _useState2[1];
// 选中的数据的键
// const checkedKeys = useMemo(() => checkedValues.map(v => v), [checkedValues]);
// 搜索后的筛选项
var _useState3 = useState(filters),
_useState4 = _slicedToArray(_useState3, 2),
options = _useState4[0],
setOptions = _useState4[1];
var delayedFn = useDelayedFn();
// 是否存在搜索, 当数据大于8时存在搜索
var isSearch = useMemo(function () {
return filters.length > 8 && !!(showSearch !== null && showSearch !== void 0 ? showSearch : true);
}, [filters.length, showSearch]);
var isAllCheck = useMemo(function () {
return !!(showAllChecked !== null && showAllChecked !== void 0 ? showAllChecked : true);
}, [showAllChecked]);
// 是否全选: 选中的数据大于等于筛选后的数据 && 筛选后的数据全部存在于选中的数据中
var checkAll = useMemo(function () {
var isAll = checkedValues.length >= options.length;
return isAll && options.every(function (_ref2) {
var value = _ref2.value;
return checkedValues.some(function (v) {
return v === value;
});
});
}, [checkedValues, options]);
// 是否半选: 存在选中的数据 && 未全选
var indeterminate = useMemo(function () {
return checkedValues.length && !checkAll;
}, [checkedValues.length, checkAll]);
// 搜索
var handleFilter = function handleFilter() {
var val = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
var serachValues = filters.filter(function (v) {
return v.label.indexOf(val) > -1;
});
setOptions(serachValues);
};
// 单选事件
var onChange = function onChange(e, item) {
e.preventDefault();
var nValue = checkedValues.some(function (value) {
return value === item.value;
}) ? checkedValues.filter(function (value) {
return value !== item.value;
}) : uniqueFunc([].concat(_toConsumableArray(checkedValues), [item.value]), 'value');
setCheckedValues(nValue);
};
// 全选事件
var onCheckAllChange = function onCheckAllChange() {
var nValue = checkAll ? checkedValues.filter(function (value) {
return !options.some(function (v) {
return v.value === value;
});
}) : uniqueFunc([].concat(_toConsumableArray(checkedValues), _toConsumableArray(options.map(function (_ref3) {
var value = _ref3.value;
return value;
}))), 'value');
setCheckedValues(nValue);
};
// 取消 不执行查询操作 关闭下拉框
var handleCancel = function handleCancel() {
// 手动触发内容改变(不会触发onChange事件)
setVisible === null || setVisible === void 0 ? void 0 : setVisible(false);
};
// 确定 执行查询操作
var handleSure = function handleSure() {
setFilterValue(checkedValues);
};
// 展开下拉时触发: 赋值 && 聚焦 && 重置显示内容
useIsomorphicLayoutEffect(function () {
if (visible) {
delayedFn(function () {
var _inputRef$current;
return inputRef.current && ((_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.focus({
cursor: 'all'
}));
});
// 若开启了 Dropdown => destroyPopupOnHide=true 无需重置操作 反之需开启
// setCheckedValues(filterValue);
// inputRef.current?.setValue?.('');
// handleFilter('');
}
}, [visible]);
return /*#__PURE__*/React.createElement("div", {
className: "filter_dropdown"
}, isSearch && /*#__PURE__*/React.createElement("div", {
className: "filter_header"
}, /*#__PURE__*/React.createElement(InputSearchClose, {
ref: inputRef,
onSearch: handleFilter,
onChange: handleFilter
}), isAllCheck && /*#__PURE__*/React.createElement("div", {
className: "filter_header_operate"
}, /*#__PURE__*/React.createElement(Checkbox, {
indeterminate: indeterminate,
onChange: onCheckAllChange,
checked: checkAll,
className: "filter_tip"
}, locale.all), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("span", {
className: "filter_tip"
}, locale.selected, ": ", checkedValues.length)))), /*#__PURE__*/React.createElement(Checkbox.Group, {
value: checkedValues,
className: "filter_body"
}, /*#__PURE__*/React.createElement(VirtualList, {
options: options,
className: "filter_list"
}, function (_ref4) {
var item = _ref4.item,
resetProps = _objectWithoutProperties(_ref4, _excluded);
return /*#__PURE__*/React.createElement("div", _extends({}, resetProps, {
className: cn('filter_item', {
checked: checkedValues.some(function (value) {
return value === item.value;
})
}),
onClick: function onClick(e) {
return onChange(e, item);
}
}), /*#__PURE__*/React.createElement(Checkbox, {
value: item.value,
className: "filter_item_content"
}, item.label));
}), !options.length && /*#__PURE__*/React.createElement(EmptyFilter, {
description: locale.empty
})), /*#__PURE__*/React.createElement("div", {
className: "filter_footer"
}, /*#__PURE__*/React.createElement("div", {
className: "footer_clear",
onClick: handleCancel
}, locale.cancel), /*#__PURE__*/React.createElement(Button, {
type: "primary",
size: "small",
onClick: handleSure
}, locale.ok)));
};
export default CheckboxFilter;