UNPKG

ant-design-vue

Version:

An enterprise-class UI design language and Vue-based implementation

389 lines (338 loc) 15.4 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _vue = require("vue"); var _FilterFilled = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/FilterFilled")); var _vcMenu = _interopRequireWildcard(require("../vc-menu")); var _domClosest = _interopRequireDefault(require("../_util/dom-closest")); var _classNames4 = _interopRequireDefault(require("../_util/classNames")); var _shallowequal = _interopRequireDefault(require("../_util/shallowequal")); var _dropdown = _interopRequireDefault(require("../dropdown")); var _checkbox = _interopRequireDefault(require("../checkbox")); var _radio = _interopRequireDefault(require("../radio")); var _FilterDropdownMenuWrapper = _interopRequireDefault(require("./FilterDropdownMenuWrapper")); var _interface = require("./interface"); var _propsUtil = require("../_util/props-util"); var _initDefaultProps = _interopRequireDefault(require("../_util/props-util/initDefaultProps")); var _vnode = require("../_util/vnode"); var _BaseMixin = _interopRequireDefault(require("../_util/BaseMixin2")); var _util = require("./util"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function stopPropagation(e) { e.stopPropagation(); } var _default2 = (0, _vue.defineComponent)({ name: 'FilterMenu', mixins: [_BaseMixin.default], inheritAttrs: false, props: (0, _initDefaultProps.default)(_interface.FilterMenuProps, { column: {} }), setup: function setup(props) { var sSelectedKeys = (0, _vue.computed)(function () { return props.selectedKeys; }); var sVisible = (0, _vue.computed)(function () { return 'filterDropdownVisible' in props.column ? props.column.filterDropdownVisible : false; }); var sValueKeys = (0, _vue.computed)(function () { return (0, _util.generateValueMaps)(props.column.filters); }); var state = (0, _vue.reactive)({ neverShown: false, sSelectedKeys: sSelectedKeys.value, sKeyPathOfSelectedItem: {}, sVisible: sVisible.value, sValueKeys: sValueKeys.value }); (0, _vue.watch)(sSelectedKeys, function () { state.sSelectedKeys = sSelectedKeys.value; }); (0, _vue.watch)(sVisible, function () { state.sVisible = sVisible.value; }); (0, _vue.watch)(sValueKeys, function () { state.sValueKeys = sValueKeys.value; }); // watchEffect( // () => { // const { column } = nextProps; // if (!shallowequal(preProps.selectedKeys, nextProps.selectedKeys)) { // state.sSelectedKeys = nextProps.selectedKeys; // } // if (!shallowequal((preProps.column || {}).filters, (nextProps.column || {}).filters)) { // state.sValueKeys = generateValueMaps(nextProps.column.filters); // } // if ('filterDropdownVisible' in column) { // state.sVisible = column.filterDropdownVisible; // } // preProps = { ...nextProps }; // }, // { flush: 'sync' }, // ); return state; }, mounted: function mounted() { var _this = this; var column = this.column; (0, _vue.nextTick)(function () { _this.setNeverShown(column); }); }, updated: function updated() { var _this2 = this; var column = this.column; (0, _vue.nextTick)(function () { _this2.setNeverShown(column); }); }, methods: { getDropdownVisible: function getDropdownVisible() { return this.neverShown ? false : this.sVisible; }, setNeverShown: function setNeverShown(column) { var rootNode = (0, _propsUtil.findDOMNode)(this); var filterBelongToScrollBody = !!(0, _domClosest.default)(rootNode, ".ant-table-scroll"); if (filterBelongToScrollBody) { // When fixed column have filters, there will be two dropdown menus // Filter dropdown menu inside scroll body should never be shown // To fix https://github.com/ant-design/ant-design/issues/5010 and // https://github.com/ant-design/ant-design/issues/7909 this.neverShown = !!column.fixed; } }, setSelectedKeys: function setSelectedKeys(_ref) { var selectedKeys = _ref.selectedKeys; this.setState({ sSelectedKeys: selectedKeys }); }, setVisible: function setVisible(visible) { var column = this.column; if (!('filterDropdownVisible' in column)) { this.setState({ sVisible: visible }); } if (column.onFilterDropdownVisibleChange) { column.onFilterDropdownVisibleChange(visible); } }, handleClearFilters: function handleClearFilters() { this.setState({ sSelectedKeys: [] }, this.handleConfirm); }, handleConfirm: function handleConfirm() { this.setVisible(false); // Call `setSelectedKeys` & `confirm` in the same time will make filter data not up to date // https://github.com/ant-design/ant-design/issues/12284 this.$forceUpdate(); (0, _vue.nextTick)(this.confirmFilter2); }, onVisibleChange: function onVisibleChange(visible) { this.setVisible(visible); var column = this.$props.column; // https://github.com/ant-design/ant-design/issues/17833 if (!visible && !(column.filterDropdown instanceof Function)) { this.confirmFilter2(); } }, handleMenuItemClick: function handleMenuItemClick(info) { var selectedKeys = this.sSelectedKeys; if (!info.keyPath || info.keyPath.length <= 1) { return; } var keyPathOfSelectedItem = this.sKeyPathOfSelectedItem; if (selectedKeys && selectedKeys.indexOf(info.key) >= 0) { // deselect SubMenu child delete keyPathOfSelectedItem[info.key]; } else { // select SubMenu child keyPathOfSelectedItem[info.key] = info.keyPath; } this.setState({ sKeyPathOfSelectedItem: keyPathOfSelectedItem }); }, hasSubMenu: function hasSubMenu() { var _this$column$filters = this.column.filters, filters = _this$column$filters === void 0 ? [] : _this$column$filters; return filters.some(function (item) { return !!(item.children && item.children.length > 0); }); }, confirmFilter2: function confirmFilter2() { var _this$$props = this.$props, column = _this$$props.column, propSelectedKeys = _this$$props.selectedKeys, confirmFilter = _this$$props.confirmFilter; var selectedKeys = this.sSelectedKeys, valueKeys = this.sValueKeys; var filterDropdown = column.filterDropdown; if (!(0, _shallowequal.default)(selectedKeys, propSelectedKeys)) { confirmFilter(column, filterDropdown ? selectedKeys : selectedKeys.map(function (key) { return valueKeys[key]; }).filter(function (key) { return key !== undefined; })); } }, renderMenus: function renderMenus(items) { var _this3 = this; var _this$$props2 = this.$props, dropdownPrefixCls = _this$$props2.dropdownPrefixCls, prefixCls = _this$$props2.prefixCls; return items.map(function (item) { if (item.children && item.children.length > 0) { var sKeyPathOfSelectedItem = _this3.sKeyPathOfSelectedItem; var containSelected = Object.keys(sKeyPathOfSelectedItem).some(function (key) { return sKeyPathOfSelectedItem[key].indexOf(item.value) >= 0; }); var subMenuCls = (0, _classNames4.default)("".concat(prefixCls, "-dropdown-submenu"), _defineProperty({}, "".concat(dropdownPrefixCls, "-submenu-contain-selected"), containSelected)); return (0, _vue.createVNode)(_vcMenu.SubMenu, { "title": item.text, "popupClassName": subMenuCls, "key": item.value }, { default: function _default() { return [_this3.renderMenus(item.children)]; } }); } return _this3.renderMenuItem(item); }); }, renderFilterIcon: function renderFilterIcon() { var _classNames2; var _a, _b; var column = this.column, locale = this.locale, prefixCls = this.prefixCls, selectedKeys = this.selectedKeys; var filtered = selectedKeys && selectedKeys.length > 0; var filterIcon = column.filterIcon; if (typeof filterIcon === 'function') { filterIcon = filterIcon({ filtered: filtered, column: column }); } var dropdownIconClass = (0, _classNames4.default)((_classNames2 = {}, _defineProperty(_classNames2, "".concat(prefixCls, "-selected"), 'filtered' in column ? column.filtered : filtered), _defineProperty(_classNames2, "".concat(prefixCls, "-open"), this.getDropdownVisible()), _classNames2)); if (!filterIcon) { return (0, _vue.createVNode)(_FilterFilled.default, { "title": locale.filterTitle, "class": dropdownIconClass, "onClick": stopPropagation }, null); } if (filterIcon.length === 1 && (0, _propsUtil.isValidElement)(filterIcon[0])) { return (0, _vnode.cloneElement)(filterIcon[0], { title: ((_a = filterIcon.props) === null || _a === void 0 ? void 0 : _a.title) || locale.filterTitle, onClick: stopPropagation, class: (0, _classNames4.default)("".concat(prefixCls, "-icon"), dropdownIconClass, (_b = filterIcon.props) === null || _b === void 0 ? void 0 : _b.class) }); } return (0, _vue.createVNode)("span", { "class": (0, _classNames4.default)("".concat(prefixCls, "-icon"), dropdownIconClass), "onClick": stopPropagation }, [filterIcon]); }, renderMenuItem: function renderMenuItem(item) { var column = this.column; var selectedKeys = this.sSelectedKeys; var multiple = 'filterMultiple' in column ? column.filterMultiple : true; var input = multiple ? (0, _vue.createVNode)(_checkbox.default, { "checked": selectedKeys && selectedKeys.indexOf(item.value) >= 0 }, null) : (0, _vue.createVNode)(_radio.default, { "checked": selectedKeys && selectedKeys.indexOf(item.value) >= 0 }, null); return (0, _vue.createVNode)(_vcMenu.Item, { "key": item.value }, { default: function _default() { return [input, (0, _vue.createVNode)("span", null, [item.text])]; } }); } }, render: function render() { var _this4 = this; var originSelectedKeys = this.sSelectedKeys; var column = this.column, locale = this.locale, prefixCls = this.prefixCls, dropdownPrefixCls = this.dropdownPrefixCls, getPopupContainer = this.getPopupContainer; // default multiple selection in filter dropdown var multiple = 'filterMultiple' in column ? column.filterMultiple : true; var dropdownMenuClass = (0, _classNames4.default)(_defineProperty({}, "".concat(dropdownPrefixCls, "-menu-without-submenu"), !this.hasSubMenu())); var filterDropdown = column.filterDropdown; if (filterDropdown instanceof Function) { filterDropdown = filterDropdown({ prefixCls: "".concat(dropdownPrefixCls, "-custom"), setSelectedKeys: function setSelectedKeys(selectedKeys) { return _this4.setSelectedKeys({ selectedKeys: selectedKeys }); }, selectedKeys: originSelectedKeys, confirm: this.handleConfirm, clearFilters: this.handleClearFilters, filters: column.filters, visible: this.getDropdownVisible(), column: column }); } var menus = filterDropdown ? (0, _vue.createVNode)(_FilterDropdownMenuWrapper.default, { "class": "".concat(prefixCls, "-dropdown") }, { default: function _default() { return [filterDropdown]; } }) : (0, _vue.createVNode)(_FilterDropdownMenuWrapper.default, { "class": "".concat(prefixCls, "-dropdown") }, { default: function _default() { return [(0, _vue.createVNode)(_vcMenu.default, { "multiple": multiple, "onClick": _this4.handleMenuItemClick, "prefixCls": "".concat(dropdownPrefixCls, "-menu"), "class": dropdownMenuClass, "onSelect": _this4.setSelectedKeys, "onDeselect": _this4.setSelectedKeys, "selectedKeys": originSelectedKeys, "getPopupContainer": getPopupContainer }, { default: function _default() { return [_this4.renderMenus(column.filters)]; } }), (0, _vue.createVNode)("div", { "class": "".concat(prefixCls, "-dropdown-btns") }, [(0, _vue.createVNode)("a", { "class": "".concat(prefixCls, "-dropdown-link confirm"), "onClick": _this4.handleConfirm }, [locale.filterConfirm]), (0, _vue.createVNode)("a", { "class": "".concat(prefixCls, "-dropdown-link clear"), "onClick": _this4.handleClearFilters }, [locale.filterReset])])]; } }); return (0, _vue.createVNode)(_dropdown.default, { "trigger": ['click'], "placement": "bottomRight", "visible": this.getDropdownVisible(), "onVisibleChange": this.onVisibleChange, "getPopupContainer": getPopupContainer, "forceRender": true, "overlay": menus }, { default: function _default() { return [_this4.renderFilterIcon()]; } }); } }); exports.default = _default2;