UNPKG

linkmore-design

Version:

🌈 🚀lm组件库。🚀

98 lines (94 loc) 4.33 kB
"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.useCheckboxOptions = exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _ahooks = require("ahooks"); var _classnames = _interopRequireDefault(require("classnames")); var _checkbox = _interopRequireDefault(require("../checkbox")); var _virtualList = _interopRequireDefault(require("../virtual-list")); var _react = _interopRequireWildcard(require("react")); var _hooks = require("../hooks"); var _utils = require("./utils"); var _empty = _interopRequireDefault(require("../empty")); const FilterEmpty = () => { return /*#__PURE__*/_react.default.createElement("div", { className: "filter_empty" }, /*#__PURE__*/_react.default.createElement(_empty.default, { title: "\u6682\u65E0\u6570\u636E" })); }; // todo 抽取出来, 后续做统一处理, 项目中多处用到类似的功能 const useCheckboxOptions = (options, { value = [], onChange: onCheckChange }, filter = '') => { // 将value和onChange改为受控,和父组件共享 const [checkedValues, setCheckedValues] = (0, _ahooks.useControllableValue)({ value, onChange: onCheckChange }); const renderOptions = (0, _react.useMemo)(() => options.filter(v => !v.disabled && (0, _utils.onStringSearch)(filter, v.label)), [options, filter]); // 是否全选: 选中的数据大于等于筛选后的数据 && 筛选后的数据全部存在于选中的数据中 const checkAll = (0, _react.useMemo)(() => { const isLen = checkedValues.length >= renderOptions.length; return isLen && renderOptions.every(({ value }) => checkedValues.includes(value)); }, [checkedValues.length, renderOptions]); // 是否半选: 存在选中的数据 && 未全选 const indeterminate = (0, _react.useMemo)(() => checkedValues.length && !checkAll, [checkedValues.length, checkAll]); // 全选事件 const onCheckAllChange = (0, _hooks.useEvent)(() => { const nValue = checkAll ? checkedValues.filter(v => !renderOptions.some(({ value }) => v === value)) : Array.from(new Set([...checkedValues, ...renderOptions.map(v => v.value)])); setCheckedValues(nValue || []); }); const onChange = (0, _hooks.useEvent)((e, item) => { e.preventDefault(); e.stopPropagation(); const arr = checkedValues.includes(item.value) ? checkedValues.filter(v => v !== item.value) : [...checkedValues, item.value]; setCheckedValues(arr || []); }); return /*#__PURE__*/_react.default.createElement("div", { className: "select_dropdown" }, /*#__PURE__*/_react.default.createElement("div", { className: "filter_header" }, /*#__PURE__*/_react.default.createElement("div", { className: "filter_header_operate" }, /*#__PURE__*/_react.default.createElement(_checkbox.default, { indeterminate: indeterminate, onChange: onCheckAllChange, checked: checkAll, className: "filter_tip" }, "\u5168\u90E8"), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("span", { className: "filter_tip" }, "\u5DF2\u9009: ", checkedValues.length)))), /*#__PURE__*/_react.default.createElement(_checkbox.default.Group, { value: checkedValues, className: "filter_body" }, /*#__PURE__*/_react.default.createElement(_virtualList.default, { options: renderOptions, className: "filter_list" }, ({ item, ...resetProps }) => { return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, resetProps, { className: (0, _classnames.default)('filter_item', { checked: checkedValues.includes(item.value), disabled: item.disabled }), onClick: e => onChange(e, item) }), /*#__PURE__*/_react.default.createElement(_checkbox.default, { value: item.value, className: "filter_item-content" }, item.label)); }), !renderOptions.length && /*#__PURE__*/_react.default.createElement(FilterEmpty, null))); }; exports.useCheckboxOptions = useCheckboxOptions; var _default = useCheckboxOptions; exports.default = _default;