@perfma/heaven
Version:
An UI Framework base [Ant Design V4](https://ant.design/components/overview-cn/) for React.
283 lines (244 loc) • 11 kB
JavaScript
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;