UNPKG

@aplus-frontend/antdv

Version:

Vue basic component library maintained based on ant-design-vue

502 lines (501 loc) 18.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _vue = require("vue"); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _FilterFilled = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/FilterFilled")); var _button = _interopRequireDefault(require("../../../button")); var _menu = _interopRequireDefault(require("../../../menu")); var _checkbox = _interopRequireDefault(require("../../../checkbox")); var _radio = _interopRequireDefault(require("../../../radio")); var _dropdown = _interopRequireDefault(require("../../../dropdown")); var _empty = _interopRequireDefault(require("../../../empty")); var _FilterWrapper = _interopRequireDefault(require("./FilterWrapper")); var _ = require("."); var _classNames = _interopRequireDefault(require("../../../_util/classNames")); var _useConfigInject = _interopRequireDefault(require("../../../config-provider/hooks/useConfigInject")); var _context = require("../../context"); var _FilterSearch = _interopRequireDefault(require("./FilterSearch")); var _tree = _interopRequireDefault(require("../../../tree")); var _devWarning = _interopRequireDefault(require("../../../vc-util/devWarning")); var _isEqual = _interopRequireDefault(require("../../../vc-util/isEqual")); const { SubMenu, Item: MenuItem } = _menu.default; function hasSubMenu(filters) { return filters.some(_ref => { let { children } = _ref; return children && children.length > 0; }); } 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(_ref2) { let { filters, prefixCls, filteredKeys, filterMultiple, searchValue, filterSearch } = _ref2; return filters.map((filter, index) => { const key = String(filter.value); if (filter.children) { return (0, _vue.createVNode)(SubMenu, { "key": key || index, "title": filter.text, "popupClassName": `${prefixCls}-dropdown-submenu` }, { default: () => [renderFilterItems({ filters: filter.children, prefixCls, filteredKeys, filterMultiple, searchValue, filterSearch })] }); } const Component = filterMultiple ? _checkbox.default : _radio.default; const item = (0, _vue.createVNode)(MenuItem, { "key": filter.value !== undefined ? key : index }, { default: () => [(0, _vue.createVNode)(Component, { "checked": filteredKeys.includes(key) }, null), (0, _vue.createVNode)("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 _default = exports.default = (0, _vue.defineComponent)({ name: 'FilterDropdown', props: ['tablePrefixCls', 'prefixCls', 'dropdownPrefixCls', 'column', 'filterState', 'filterMultiple', 'filterMode', 'filterSearch', 'columnKey', 'triggerFilter', 'locale', 'getPopupContainer'], setup(props, _ref3) { let { slots } = _ref3; const contextSlots = (0, _context.useInjectSlots)(); const filterMode = (0, _vue.computed)(() => { var _a; return (_a = props.filterMode) !== null && _a !== void 0 ? _a : 'menu'; }); const filterSearch = (0, _vue.computed)(() => { var _a; return (_a = props.filterSearch) !== null && _a !== void 0 ? _a : false; }); const filterDropdownOpen = (0, _vue.computed)(() => props.column.filterDropdownOpen || props.column.filterDropdownVisible); const onFilterDropdownOpenChange = (0, _vue.computed)(() => props.column.onFilterDropdownOpenChange || props.column.onFilterDropdownVisibleChange); if (process.env.NODE_ENV !== 'production') { [['filterDropdownVisible', 'filterDropdownOpen', props.column.filterDropdownVisible], ['onFilterDropdownVisibleChange', 'onFilterDropdownOpenChange', props.column.onFilterDropdownVisibleChange]].forEach(_ref4 => { let [deprecatedName, newName, prop] = _ref4; (0, _devWarning.default)(prop === undefined || prop === null, 'Table', `\`${deprecatedName}\` is deprecated. Please use \`${newName}\` instead.`); }); } const visible = (0, _vue.shallowRef)(false); const filtered = (0, _vue.computed)(() => { var _a; return !!(props.filterState && (((_a = props.filterState.filteredKeys) === null || _a === void 0 ? void 0 : _a.length) || props.filterState.forceFiltered)); }); const filterFlattenKeys = (0, _vue.computed)(() => { var _a; return (0, _.flattenKeys)((_a = props.column) === null || _a === void 0 ? void 0 : _a.filters); }); const filterDropdownRef = (0, _vue.computed)(() => { const { filterDropdown, slots = {}, customFilterDropdown } = props.column; return filterDropdown || slots.filterDropdown && contextSlots.value[slots.filterDropdown] || customFilterDropdown && contextSlots.value.customFilterDropdown; }); const filterIconRef = (0, _vue.computed)(() => { const { filterIcon, slots = {} } = props.column; return filterIcon || slots.filterIcon && contextSlots.value[slots.filterIcon] || contextSlots.value.customFilterIcon; }); const triggerVisible = newVisible => { var _a; visible.value = newVisible; (_a = onFilterDropdownOpenChange.value) === null || _a === void 0 ? void 0 : _a.call(onFilterDropdownOpenChange, newVisible); }; const mergedVisible = (0, _vue.computed)(() => typeof filterDropdownOpen.value === 'boolean' ? filterDropdownOpen.value : visible.value); const propFilteredKeys = (0, _vue.computed)(() => { var _a; return (_a = props.filterState) === null || _a === void 0 ? void 0 : _a.filteredKeys; }); const filteredKeys = (0, _vue.shallowRef)([]); const onSelectKeys = _ref5 => { let { selectedKeys } = _ref5; filteredKeys.value = selectedKeys; }; const onCheck = (keys, _ref6) => { let { node, checked } = _ref6; if (!props.filterMultiple) { onSelectKeys({ selectedKeys: checked && node.key ? [node.key] : [] }); } else { onSelectKeys({ selectedKeys: keys }); } }; (0, _vue.watch)(propFilteredKeys, () => { if (!visible.value) { return; } onSelectKeys({ selectedKeys: propFilteredKeys.value || [] }); }, { immediate: true }); // const expandKeys = shallowRef(filterFlattenKeys.value.slice()); // const onExpandChange = keys => (expandKeys.value = keys); const openKeys = (0, _vue.shallowRef)([]); const openRef = (0, _vue.shallowRef)(); const onOpenChange = keys => { openRef.value = setTimeout(() => { openKeys.value = keys; }); }; const onMenuClick = () => { clearTimeout(openRef.value); }; (0, _vue.onBeforeUnmount)(() => { clearTimeout(openRef.value); }); const searchValue = (0, _vue.shallowRef)(''); const onSearch = e => { const { value } = e.target; searchValue.value = value; }; // clear search value after close filter dropdown (0, _vue.watch)(visible, () => { if (!visible.value) { searchValue.value = ''; } }); // ======================= Submit ======================== const internalTriggerFilter = keys => { const { column, columnKey, filterState } = props; const mergedKeys = keys && keys.length ? keys : null; if (mergedKeys === null && (!filterState || !filterState.filteredKeys)) { return null; } if ((0, _isEqual.default)(mergedKeys, filterState === null || filterState === void 0 ? void 0 : filterState.filteredKeys, true)) { return null; } props.triggerFilter({ column, key: columnKey, filteredKeys: mergedKeys }); }; const onConfirm = () => { triggerVisible(false); internalTriggerFilter(filteredKeys.value); }; const onReset = function () { let { confirm, closeDropdown } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { confirm: false, closeDropdown: false }; if (confirm) { internalTriggerFilter([]); } if (closeDropdown) { triggerVisible(false); } searchValue.value = ''; if (props.column.filterResetToDefaultFilteredValue) { filteredKeys.value = (props.column.defaultFilteredValue || []).map(key => String(key)); } else { filteredKeys.value = []; } }; const doFilter = function () { let { closeDropdown } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { closeDropdown: true }; if (closeDropdown) { triggerVisible(false); } internalTriggerFilter(filteredKeys.value); }; const onVisibleChange = newVisible => { if (newVisible && propFilteredKeys.value !== undefined) { // Sync filteredKeys on appear in controlled mode (propFilteredKeys.value !== undefiend) filteredKeys.value = propFilteredKeys.value || []; } triggerVisible(newVisible); // Default will filter when closed if (!newVisible && !filterDropdownRef.value) { onConfirm(); } }; const { direction } = (0, _useConfigInject.default)('', props); const onCheckAll = e => { if (e.target.checked) { const allFilterKeys = filterFlattenKeys.value; filteredKeys.value = allFilterKeys; } else { filteredKeys.value = []; } }; const getTreeData = _ref7 => { let { filters } = _ref7; return (filters || []).map((filter, index) => { const key = String(filter.value); const item = { title: filter.text, key: filter.value !== undefined ? key : index }; if (filter.children) { item.children = getTreeData({ filters: filter.children }); } return item; }); }; const getFilterData = node => { var _a; return (0, _extends2.default)((0, _extends2.default)({}, node), { text: node.title, value: node.key, children: ((_a = node.children) === null || _a === void 0 ? void 0 : _a.map(item => getFilterData(item))) || [] }); }; const treeData = (0, _vue.computed)(() => getTreeData({ filters: props.column.filters })); // ======================== Style ======================== const dropdownMenuClass = (0, _vue.computed)(() => (0, _classNames.default)({ [`${props.dropdownPrefixCls}-menu-without-submenu`]: !hasSubMenu(props.column.filters || []) })); const getFilterComponent = () => { const selectedKeys = filteredKeys.value; const { column, locale, tablePrefixCls, filterMultiple, dropdownPrefixCls, getPopupContainer, prefixCls } = props; if ((column.filters || []).length === 0) { return (0, _vue.createVNode)(_empty.default, { "image": _empty.default.PRESENTED_IMAGE_SIMPLE, "description": locale.filterEmptyText, "imageStyle": { height: 24 }, "style": { margin: 0, padding: '16px 0' } }, null); } if (filterMode.value === 'tree') { return (0, _vue.createVNode)(_vue.Fragment, null, [(0, _vue.createVNode)(_FilterSearch.default, { "filterSearch": filterSearch.value, "value": searchValue.value, "onChange": onSearch, "tablePrefixCls": tablePrefixCls, "locale": locale }, null), (0, _vue.createVNode)("div", { "class": `${tablePrefixCls}-filter-dropdown-tree` }, [filterMultiple ? (0, _vue.createVNode)(_checkbox.default, { "class": `${tablePrefixCls}-filter-dropdown-checkall`, "onChange": onCheckAll, "checked": selectedKeys.length === filterFlattenKeys.value.length, "indeterminate": selectedKeys.length > 0 && selectedKeys.length < filterFlattenKeys.value.length }, { default: () => [locale.filterCheckall] }) : null, (0, _vue.createVNode)(_tree.default, { "checkable": true, "selectable": false, "blockNode": true, "multiple": filterMultiple, "checkStrictly": !filterMultiple, "class": `${dropdownPrefixCls}-menu`, "onCheck": onCheck, "checkedKeys": selectedKeys, "selectedKeys": selectedKeys, "showIcon": false, "treeData": treeData.value, "autoExpandParent": true, "defaultExpandAll": true, "filterTreeNode": searchValue.value.trim() ? node => { if (typeof filterSearch.value === 'function') { return filterSearch.value(searchValue.value, getFilterData(node)); } return searchValueMatched(searchValue.value, node.title); } : undefined }, null)])]); } return (0, _vue.createVNode)(_vue.Fragment, null, [(0, _vue.createVNode)(_FilterSearch.default, { "filterSearch": filterSearch.value, "value": searchValue.value, "onChange": onSearch, "tablePrefixCls": tablePrefixCls, "locale": locale }, null), (0, _vue.createVNode)(_menu.default, { "multiple": filterMultiple, "prefixCls": `${dropdownPrefixCls}-menu`, "class": dropdownMenuClass.value, "onClick": onMenuClick, "onSelect": onSelectKeys, "onDeselect": onSelectKeys, "selectedKeys": selectedKeys, "getPopupContainer": getPopupContainer, "openKeys": openKeys.value, "onOpenChange": onOpenChange }, { default: () => renderFilterItems({ filters: column.filters || [], filterSearch: filterSearch.value, prefixCls, filteredKeys: filteredKeys.value, filterMultiple, searchValue: searchValue.value }) })]); }; const resetDisabled = (0, _vue.computed)(() => { const selectedKeys = filteredKeys.value; if (props.column.filterResetToDefaultFilteredValue) { return (0, _isEqual.default)((props.column.defaultFilteredValue || []).map(key => String(key)), selectedKeys, true); } return selectedKeys.length === 0; }); return () => { var _a; const { tablePrefixCls, prefixCls, column, dropdownPrefixCls, locale, getPopupContainer } = props; let dropdownContent; if (typeof filterDropdownRef.value === 'function') { dropdownContent = filterDropdownRef.value({ prefixCls: `${dropdownPrefixCls}-custom`, setSelectedKeys: selectedKeys => onSelectKeys({ selectedKeys }), selectedKeys: filteredKeys.value, confirm: doFilter, clearFilters: onReset, filters: column.filters, visible: mergedVisible.value, column: column.__originColumn__, close: () => { triggerVisible(false); } }); } else if (filterDropdownRef.value) { dropdownContent = filterDropdownRef.value; } else { dropdownContent = (0, _vue.createVNode)(_vue.Fragment, null, [getFilterComponent(), (0, _vue.createVNode)("div", { "class": `${prefixCls}-dropdown-btns` }, [(0, _vue.createVNode)(_button.default, { "type": "link", "size": "small", "disabled": resetDisabled.value, "onClick": () => onReset() }, { default: () => [locale.filterReset] }), (0, _vue.createVNode)(_button.default, { "type": "primary", "size": "small", "onClick": onConfirm }, { default: () => [locale.filterConfirm] })])]); } const menu = (0, _vue.createVNode)(_FilterWrapper.default, { "class": `${prefixCls}-dropdown` }, { default: () => [dropdownContent] }); let filterIcon; if (typeof filterIconRef.value === 'function') { filterIcon = filterIconRef.value({ filtered: filtered.value, column: column.__originColumn__ }); } else if (filterIconRef.value) { filterIcon = filterIconRef.value; } else { filterIcon = (0, _vue.createVNode)(_FilterFilled.default, null, null); } return (0, _vue.createVNode)("div", { "class": `${prefixCls}-column` }, [(0, _vue.createVNode)("span", { "class": `${tablePrefixCls}-column-title` }, [(_a = slots.default) === null || _a === void 0 ? void 0 : _a.call(slots)]), (0, _vue.createVNode)(_dropdown.default, { "overlay": menu, "trigger": ['click'], "open": mergedVisible.value, "onOpenChange": onVisibleChange, "getPopupContainer": getPopupContainer, "placement": direction.value === 'rtl' ? 'bottomLeft' : 'bottomRight' }, { default: () => [(0, _vue.createVNode)("span", { "role": "button", "tabindex": -1, "class": (0, _classNames.default)(`${prefixCls}-trigger`, { active: filtered.value }), "onClick": e => { e.stopPropagation(); } }, [filterIcon])] })]); }; } });