UNPKG

@perfma/heaven

Version:

An UI Framework base [Ant Design V4](https://ant.design/components/overview-cn/) for React.

283 lines (244 loc) 11 kB
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } import React from 'react'; import { ConfigProvider, Tree, Button, Menu } from 'antd'; import Checkbox from '../../checkbox'; import Radio from '../../radio'; import Empty from '../../empty'; import FilterSearch from './filter-search'; function flattenKeys(filters) { var keys = []; (filters || []).forEach(function (_ref) { var value = _ref.value, children = _ref.children; keys.push(value); if (children) { keys = [].concat(_toConsumableArray(keys), _toConsumableArray(flattenKeys(children))); } }); return keys; } function hasSubMenu(filters) { return filters.some(function (_ref2) { var children = _ref2.children; return children; }); } function searchValueMatched(searchValue, text) { if (typeof text === 'string' || typeof text === 'number') { return text === null || text === void 0 ? void 0 : text.toString().toLowerCase().includes(searchValue.trim().toLowerCase()); } return false; } function renderFilterItems(_ref3) { var filters = _ref3.filters, prefixCls = _ref3.prefixCls, filteredKeys = _ref3.filteredKeys, filterMultiple = _ref3.filterMultiple, searchValue = _ref3.searchValue, filterSearch = _ref3.filterSearch; return filters.map(function (filter, index) { var key = String(filter.value); if (filter.children) { return /*#__PURE__*/React.createElement(Menu.SubMenu, { key: key || index, title: filter.text, popupClassName: "".concat(prefixCls, "-dropdown-submenu") }, renderFilterItems({ filters: filter.children, prefixCls: prefixCls, filteredKeys: filteredKeys, filterMultiple: filterMultiple, searchValue: searchValue, filterSearch: filterSearch })); } var Component = filterMultiple ? Checkbox : Radio; var item = /*#__PURE__*/React.createElement(Menu.Item, { key: filter.value !== undefined ? key : index }, /*#__PURE__*/React.createElement(Component, { checked: filteredKeys.includes(key) }), /*#__PURE__*/React.createElement("span", null, filter.text)); if (searchValue.trim()) { if (typeof filterSearch === 'function') { return filterSearch(searchValue, filter) ? item : undefined; } return searchValueMatched(searchValue, filter.text) ? item : undefined; } return item; }); } var FilterDropdown = function FilterDropdown(_ref4) { var setSelectedKeys = _ref4.setSelectedKeys, selectedKeys = _ref4.selectedKeys, confirm = _ref4.confirm, clearFilters = _ref4.clearFilters, visible = _ref4.visible, locale = _ref4.locale, column = _ref4.column, customizePrefixCls = _ref4.customizePrefixCls, customizeDropdownPrefixCls = _ref4.customizeDropdownPrefixCls, getPopupContainer = _ref4.getPopupContainer; var _React$useContext = React.useContext(ConfigProvider.ConfigContext), getPrefixCls = _React$useContext.getPrefixCls; var tablePrefixCls = getPrefixCls('table', customizePrefixCls); var prefixCls = "".concat(tablePrefixCls, "-filter"); var dropdownPrefixCls = getPrefixCls('dropdown', customizeDropdownPrefixCls); var dropdownMenuClass = !hasSubMenu(column.filters || []) ? "".concat(dropdownPrefixCls, "-menu-without-submenu") : ''; var _column$filterMultipl = column.filterMultiple, filterMultiple = _column$filterMultipl === void 0 ? true : _column$filterMultipl; // search in tree mode column filter var _React$useState = React.useState(''), _React$useState2 = _slicedToArray(_React$useState, 2), searchValue = _React$useState2[0], setSearchValue = _React$useState2[1]; var onSearch = function onSearch(e) { var value = e.target.value; setSearchValue(value); }; // clear search value after close filter dropdown React.useEffect(function () { if (!visible) { setSearchValue(''); setTimeout(function () { return setSelectedKeys([]); }, 200); // 因为下拉弹窗消失有延迟,所以setTimeout避免闪烁 } }, [visible]); var onCheckAll = function onCheckAll(e) { if (e.target.checked) { var allFilterKeys = flattenKeys(column === null || column === void 0 ? void 0 : column.filters).map(function (key) { return String(key); }); setSelectedKeys(allFilterKeys); } else { setSelectedKeys([]); } }; var onCheck = function onCheck(keys, _ref5) { var node = _ref5.node, checked = _ref5.checked; if (!filterMultiple) { setSelectedKeys(checked && node.key ? [node.key] : []); } else { setSelectedKeys(keys); } }; var getTreeData = function getTreeData(_ref6) { var filters = _ref6.filters; return (filters || []).map(function (filter, index) { var key = String(filter.value); var item = { title: filter.text, key: filter.value !== undefined ? key : index }; if (filter.children) { item.children = getTreeData({ filters: filter.children }); } return item; }); }; var getFilterComponent = function getFilterComponent() { if ((column.filters || []).length === 0) { return /*#__PURE__*/React.createElement(Empty, { image: Empty.PRESENTED_IMAGE_SIMPLE, description: locale === null || locale === void 0 ? void 0 : locale.filterEmptyText, imageStyle: { height: 24 }, style: { margin: 0, padding: '16px 0' } }); } if (column.filterMode === 'tree') { return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FilterSearch, { filterSearch: column.filterSearch || false, value: searchValue, onChange: onSearch, tablePrefixCls: tablePrefixCls, locale: locale }), /*#__PURE__*/React.createElement("div", { className: "".concat(tablePrefixCls, "-filter-dropdown-tree") }, filterMultiple ? /*#__PURE__*/React.createElement(Checkbox, { checked: selectedKeys.length === flattenKeys(column.filters).length, indeterminate: selectedKeys.length > 0 && selectedKeys.length < flattenKeys(column.filters).length, className: "".concat(tablePrefixCls, "-filter-dropdown-checkall"), onChange: onCheckAll }, locale === null || locale === void 0 ? void 0 : locale.filterCheckall) : null, /*#__PURE__*/React.createElement(Tree, { checkable: true, selectable: false, blockNode: true, multiple: filterMultiple, checkStrictly: !filterMultiple, className: "".concat(dropdownPrefixCls, "-menu"), onCheck: onCheck, checkedKeys: selectedKeys, selectedKeys: selectedKeys, showIcon: false, treeData: getTreeData({ filters: column.filters }), autoExpandParent: true, defaultExpandAll: true, filterTreeNode: searchValue.trim() ? function (node) { return searchValueMatched(searchValue, node.title); } : undefined }))); } return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FilterSearch, { filterSearch: column.filterSearch, value: searchValue, onChange: onSearch, tablePrefixCls: tablePrefixCls, locale: locale }), /*#__PURE__*/React.createElement(Menu, { multiple: filterMultiple, prefixCls: "".concat(dropdownPrefixCls, "-menu"), className: dropdownMenuClass, onSelect: function onSelect(_ref7) { var keys = _ref7.selectedKeys; return setSelectedKeys(keys); }, onDeselect: function onDeselect(_ref8) { var keys = _ref8.selectedKeys; return setSelectedKeys(keys); }, selectedKeys: selectedKeys, getPopupContainer: getPopupContainer }, renderFilterItems({ filters: column.filters || [], filterSearch: column.filterSearch, prefixCls: prefixCls, filteredKeys: selectedKeys, filterMultiple: filterMultiple, searchValue: searchValue }))); }; return /*#__PURE__*/React.createElement(React.Fragment, null, getFilterComponent(), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-dropdown-btns") }, /*#__PURE__*/React.createElement(Button, { type: "link", size: "small", disabled: selectedKeys.length === 0, onClick: function onClick() { return clearFilters(); } }, locale === null || locale === void 0 ? void 0 : locale.filterReset), /*#__PURE__*/React.createElement(Button, { type: "primary", size: "small", onClick: function onClick() { return confirm(); } }, locale === null || locale === void 0 ? void 0 : locale.filterConfirm))); }; export default FilterDropdown;