UNPKG

@douyinfe/semi-ui

Version:

A modern, comprehensive, flexible design system and UI library. Connect DesignOps & DevOps. Quickly build beautiful React apps. Maintained by Douyin-fe team.

208 lines (207 loc) 8.77 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = ColumnFilter; var _pick2 = _interopRequireDefault(require("lodash/pick")); var _noop2 = _interopRequireDefault(require("lodash/noop")); var _isEqual2 = _interopRequireDefault(require("lodash/isEqual")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _semiIcons = require("@douyinfe/semi-icons"); var _constants = require("@douyinfe/semi-foundation/lib/cjs/table/constants"); var _dropdown = _interopRequireDefault(require("../dropdown")); var _radio = require("../radio"); var _checkbox = require("../checkbox"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function renderDropdown(props) { let nestedElem = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; let level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; const { filterMultiple = true, filters = [], filteredValue = [], filterDropdownVisible, onSelect = _noop2.default, onFilterDropdownVisibleChange = _noop2.default, trigger = 'click', position = 'bottom', renderFilterDropdown, renderFilterDropdownItem } = props !== null && props !== void 0 ? props : {}; const renderFilterDropdownProps = (0, _pick2.default)(props, ['tempFilteredValue', 'setTempFilteredValue', 'confirm', 'clear', 'close', 'filters']); const render = typeof renderFilterDropdown === 'function' ? renderFilterDropdown(renderFilterDropdownProps) : (/*#__PURE__*/_react.default.createElement(_dropdown.default.Menu, null, Array.isArray(filters) && filters.map((filter, index) => { const changeFn = e => { const domEvent = e && e.nativeEvent; if (domEvent) { // Block this event to prevent the pop-up layer from closing domEvent.stopImmediatePropagation(); // Prevent bubbling and default events to prevent label click events from triggering twice domEvent.stopPropagation(); domEvent.preventDefault(); } let values = [...filteredValue]; const included = values.includes(filter.value); const idx = values.indexOf(filter.value); if (idx > -1) { values.splice(idx, 1); } else if (filterMultiple) { values.push(filter.value); } else { values = [filter.value]; } return onSelect({ value: filter.value, filteredValue: values, included: !included, domEvent }); }; const checked = filteredValue.includes(filter.value); const { text } = filter; const { value } = filter; const key = `${level}_${index}`; const dropdownItem = typeof renderFilterDropdownItem === 'function' ? renderFilterDropdownItem({ onChange: changeFn, filterMultiple, value, text, checked, filteredValue, level }) : null; let item = dropdownItem && /*#__PURE__*/_react.default.isValidElement(dropdownItem) ? (/*#__PURE__*/_react.default.cloneElement(dropdownItem, { key })) : (/*#__PURE__*/_react.default.createElement(_dropdown.default.Item, { key: key, onClick: changeFn }, filterMultiple ? (/*#__PURE__*/_react.default.createElement(_checkbox.Checkbox, { checked: checked }, text)) : (/*#__PURE__*/_react.default.createElement(_radio.Radio, { checked: checked }, text)))); if (Array.isArray(filter.children) && filter.children.length) { const childrenDropdownProps = Object.assign(Object.assign({}, props), { filters: filter.children, trigger: 'hover', position: 'right' }); delete childrenDropdownProps.filterDropdownVisible; item = renderDropdown(childrenDropdownProps, item, level + 1); } return item; }))); const dropdownProps = Object.assign(Object.assign({}, props), { onVisibleChange: visible => onFilterDropdownVisibleChange(visible), trigger, position, render }); if (filterDropdownVisible != null) { dropdownProps.visible = filterDropdownVisible; } return /*#__PURE__*/_react.default.createElement(_dropdown.default, Object.assign({}, dropdownProps, { key: `Dropdown_level_${level}`, className: `${_constants.cssClasses.PREFIX}-column-filter-dropdown` }), nestedElem); } function ColumnFilter() { let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; const { prefixCls = _constants.cssClasses.PREFIX, filteredValue, filterIcon = 'filter', filterDropdownProps, onSelect, filterDropdownVisible, renderFilterDropdown, onFilterDropdownVisibleChange } = props; let { filterDropdown = null } = props; // custom filter related status const isFilterDropdownVisibleControlled = typeof filterDropdownVisible !== 'undefined'; const isCustomFilterDropdown = typeof renderFilterDropdown === 'function'; const isCustomDropdownVisible = !isFilterDropdownVisibleControlled && isCustomFilterDropdown; const [tempFilteredValue, setTempFilteredValue] = (0, _react.useState)(filteredValue); const dropdownVisibleInitValue = isCustomDropdownVisible ? false : filterDropdownVisible; const [dropdownVisible, setDropdownVisible] = (0, _react.useState)(dropdownVisibleInitValue); (0, _react.useEffect)(() => { if (typeof filterDropdownVisible !== 'undefined') { setDropdownVisible(filterDropdownVisible); } }, [filterDropdownVisible]); (0, _react.useEffect)(() => { setTempFilteredValue(filteredValue); }, [filteredValue]); const confirm = function () { let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; const newFilteredValue = (props === null || props === void 0 ? void 0 : props.filteredValue) || tempFilteredValue; if (!(0, _isEqual2.default)(newFilteredValue, filteredValue)) { onSelect({ filteredValue: newFilteredValue }); } if (props.closeDropdown) { setDropdownVisible(false); } }; const clear = function () { let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; setTempFilteredValue([]); onSelect({ filteredValue: [] }); if (props.closeDropdown) { setDropdownVisible(false); } }; const close = () => { setDropdownVisible(false); }; const handleFilterDropdownVisibleChange = visible => { if (isCustomDropdownVisible) { setDropdownVisible(visible); } onFilterDropdownVisibleChange(visible); }; const renderFilterDropdownProps = { tempFilteredValue, setTempFilteredValue, confirm, clear, close }; const finalCls = (0, _classnames.default)(`${prefixCls}-column-filter`, { on: Array.isArray(filteredValue) && filteredValue.length }); let iconElem; if (typeof filterIcon === 'function') { iconElem = filterIcon(Array.isArray(filteredValue) && filteredValue.length > 0); } else if (/*#__PURE__*/(0, _react.isValidElement)(filterIcon)) { iconElem = filterIcon; } else { iconElem = /*#__PURE__*/_react.default.createElement("div", { className: finalCls }, '\u200b' /* ZWSP(zero-width space) */, /*#__PURE__*/_react.default.createElement(_semiIcons.IconFilter, { role: "button", "aria-label": "Filter data with this column", "aria-haspopup": "listbox", tabIndex: -1, size: "default" })); } const renderProps = Object.assign(Object.assign(Object.assign(Object.assign({}, props), filterDropdownProps), renderFilterDropdownProps), { filterDropdownVisible: isFilterDropdownVisibleControlled ? filterDropdownVisible : dropdownVisible, onFilterDropdownVisibleChange: handleFilterDropdownVisibleChange }); filterDropdown = /*#__PURE__*/_react.default.isValidElement(filterDropdown) ? filterDropdown : renderDropdown(renderProps, iconElem); return filterDropdown; }