UNPKG

choerodon-ui

Version:

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

349 lines (291 loc) 12.6 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"]; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper")); var _react = _interopRequireWildcard(require("react")); var _reactDom = require("react-dom"); var _domClosest = _interopRequireDefault(require("dom-closest")); var _classnames = _interopRequireDefault(require("classnames")); var _shallowequal = _interopRequireDefault(require("shallowequal")); var _dropdown = _interopRequireDefault(require("../dropdown")); var _icon = _interopRequireDefault(require("../icon")); var _checkbox = _interopRequireDefault(require("../checkbox")); var _radio = _interopRequireDefault(require("../radio")); var _FilterDropdownMenuWrapper = _interopRequireDefault(require("./FilterDropdownMenuWrapper")); var _menu = _interopRequireWildcard(require("../rc-components/menu")); var FilterMenu = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(FilterMenu, _Component); var _super = (0, _createSuper2["default"])(FilterMenu); function FilterMenu(props) { var _this; (0, _classCallCheck2["default"])(this, FilterMenu); _this = _super.call(this, props); _this.setNeverShown = function (column) { var rootNode = (0, _reactDom.findDOMNode)((0, _assertThisInitialized2["default"])(_this)); var prefixCls = _this.props.prefixCls; var filterBelongToScrollBody = !!(0, _domClosest["default"])(rootNode, "".concat(prefixCls, "-scroll")); if (filterBelongToScrollBody) { // When fixed column have filters, there will be two dropdown menus // Filter dropdown menu inside scroll body should never be shown _this.neverShown = !!column.fixed; } }; _this.setSelectedKeys = function (_ref) { var selectedKeys = _ref.selectedKeys; _this.setState({ selectedKeys: selectedKeys }); }; _this.handleClearFilters = function () { _this.setState({ selectedKeys: [] }, _this.handleConfirm); }; _this.handleConfirm = function () { _this.setVisible(false); _this.confirmFilter(); }; _this.onVisibleChange = function (visible) { _this.setVisible(visible); if (!visible) { _this.confirmFilter(); } }; _this.handleFilterDropdownMenuClick = function (e) { e.preventDefault(); }; _this.handleMenuItemClick = function (info) { if (!info.keyPath || info.keyPath.length <= 1) { return; } var _this$state = _this.state, keyPathOfSelectedItem = _this$state.keyPathOfSelectedItem, selectedKeys = _this$state.selectedKeys; if (selectedKeys.indexOf(info.key) >= 0) { // deselect SubMenu child delete keyPathOfSelectedItem[info.key]; } else { // select SubMenu child keyPathOfSelectedItem[info.key] = info.keyPath; } _this.setState({ keyPathOfSelectedItem: keyPathOfSelectedItem }); }; _this.renderFilterIcon = function () { var _this$props = _this.props, column = _this$props.column, locale = _this$props.locale, prefixCls = _this$props.prefixCls, selectedKeys = _this$props.selectedKeys; var filterd = selectedKeys.length > 0; var filterIcon = column.filterIcon; if (typeof filterIcon === 'function') { filterIcon = filterIcon(filterd); } var dropdownSelectedClass = filterd ? "".concat(prefixCls, "-selected") : ''; return filterIcon ? /*#__PURE__*/(0, _react.cloneElement)(filterIcon, { title: locale.filterTitle, className: (0, _classnames["default"])("".concat(prefixCls, "-icon"), filterIcon.props.className) }) : /*#__PURE__*/_react["default"].createElement(_icon["default"], { title: locale.filterTitle, type: "filter_list", className: dropdownSelectedClass }); }; var visible = 'filterDropdownVisible' in props.column ? props.column.filterDropdownVisible : false; _this.state = { selectedKeys: props.selectedKeys, keyPathOfSelectedItem: {}, visible: visible }; return _this; } (0, _createClass2["default"])(FilterMenu, [{ key: "componentDidMount", value: function componentDidMount() { var column = this.props.column; this.setNeverShown(column); } }, { key: "componentWillReceiveProps", value: function componentWillReceiveProps(nextProps) { var column = nextProps.column; this.setNeverShown(column); var newState = {}; var selectedKeys = this.props.selectedKeys; if ('selectedKeys' in nextProps && !(0, _shallowequal["default"])(selectedKeys, nextProps.selectedKeys)) { newState.selectedKeys = nextProps.selectedKeys; } if ('filterDropdownVisible' in column) { newState.visible = column.filterDropdownVisible; } if (Object.keys(newState).length > 0) { this.setState(newState); } } }, { key: "setVisible", value: function setVisible(visible) { var column = this.props.column; if (!('filterDropdownVisible' in column)) { this.setState({ visible: visible }); } if (column.onFilterDropdownVisibleChange) { column.onFilterDropdownVisibleChange(visible); } } }, { key: "confirmFilter", value: function confirmFilter() { var _this$props2 = this.props, propSelectedKeys = _this$props2.selectedKeys, column = _this$props2.column, confirmFilter = _this$props2.confirmFilter; var selectedKeys = this.state.selectedKeys; if (!(0, _shallowequal["default"])(selectedKeys, propSelectedKeys)) { confirmFilter(column, selectedKeys); } } }, { key: "renderMenuItem", value: function renderMenuItem(item) { var _this$props3 = this.props, column = _this$props3.column, radioPrefixCls = _this$props3.radioPrefixCls, checkboxPrefixCls = _this$props3.checkboxPrefixCls; var selectedKeys = this.state.selectedKeys; var multiple = 'filterMultiple' in column ? column.filterMultiple : true; var input = multiple ? /*#__PURE__*/_react["default"].createElement(_checkbox["default"], { prefixCls: checkboxPrefixCls, checked: selectedKeys.indexOf(item.value.toString()) >= 0 }) : /*#__PURE__*/_react["default"].createElement(_radio["default"], { prefixCls: radioPrefixCls, checked: selectedKeys.indexOf(item.value.toString()) >= 0 }); return /*#__PURE__*/_react["default"].createElement(_menu.Item, { key: item.value, checkable: false }, input, /*#__PURE__*/_react["default"].createElement("span", null, item.text)); } }, { key: "hasSubMenu", value: function hasSubMenu() { var _this$props$column$fi = this.props.column.filters, filters = _this$props$column$fi === void 0 ? [] : _this$props$column$fi; return filters.some(function (item) { return !!(item.children && item.children.length > 0); }); } }, { key: "renderMenus", value: function renderMenus(items) { var _this2 = this; return items.map(function (item) { if (item.children && item.children.length > 0) { var dropdownPrefixCls = _this2.props.dropdownProps.prefixCls; var keyPathOfSelectedItem = _this2.state.keyPathOfSelectedItem; var containSelected = Object.keys(keyPathOfSelectedItem).some(function (key) { return keyPathOfSelectedItem[key].indexOf(item.value) >= 0; }); var subMenuCls = containSelected ? "".concat(dropdownPrefixCls, "-submenu-contain-selected") : ''; return /*#__PURE__*/_react["default"].createElement(_menu.SubMenu, { title: item.text, className: subMenuCls, key: item.value.toString() }, _this2.renderMenus(item.children)); } return _this2.renderMenuItem(item); }); } }, { key: "render", value: function render() { var _this3 = this; var _this$props4 = this.props, column = _this$props4.column, locale = _this$props4.locale, prefixCls = _this$props4.prefixCls, dropdownProps = _this$props4.dropdownProps, getPopupContainer = _this$props4.getPopupContainer, rippleDisabled = _this$props4.rippleDisabled; var _this$state2 = this.state, visible = _this$state2.visible, selectedKeys = _this$state2.selectedKeys; var dropdownPrefixCls = dropdownProps.prefixCls; // default multiple selection in filter dropdown var multiple = 'filterMultiple' in column ? column.filterMultiple : true; var dropdownMenuClass = (0, _classnames["default"])((0, _defineProperty2["default"])({}, "".concat(dropdownPrefixCls, "-menu-without-submenu"), !this.hasSubMenu())); var filterDropdown = column.filterDropdown; if (filterDropdown && typeof filterDropdown === 'function') { filterDropdown = filterDropdown({ prefixCls: "".concat(dropdownPrefixCls, "-custom"), setSelectedKeys: function setSelectedKeys($selectedKeys) { return _this3.setSelectedKeys({ selectedKeys: $selectedKeys }); }, selectedKeys: selectedKeys, confirm: this.handleConfirm, clearFilters: this.handleClearFilters, filters: column.filters, getPopupContainer: function getPopupContainer(triggerNode) { return triggerNode.parentNode; } }); } var menus = filterDropdown ? /*#__PURE__*/_react["default"].createElement(_FilterDropdownMenuWrapper["default"], { onClick: this.handleFilterDropdownMenuClick }, filterDropdown) : /*#__PURE__*/_react["default"].createElement(_FilterDropdownMenuWrapper["default"], { className: "".concat(prefixCls, "-dropdown"), onClick: this.handleFilterDropdownMenuClick }, /*#__PURE__*/_react["default"].createElement(_menu["default"], { multiple: multiple, rippleDisabled: rippleDisabled, onClick: this.handleMenuItemClick, prefixCls: "".concat(dropdownPrefixCls, "-menu"), className: dropdownMenuClass, onSelect: this.setSelectedKeys, onDeselect: this.setSelectedKeys, selectedKeys: selectedKeys, getPopupContainer: function getPopupContainer(triggerNode) { return triggerNode.parentNode; } }, this.renderMenus(column.filters)), /*#__PURE__*/_react["default"].createElement("div", { className: "".concat(prefixCls, "-dropdown-btns") }, /*#__PURE__*/_react["default"].createElement("a", { className: "".concat(prefixCls, "-dropdown-link confirm"), onClick: this.handleConfirm }, locale.filterConfirm), /*#__PURE__*/_react["default"].createElement("a", { className: "".concat(prefixCls, "-dropdown-link clear"), onClick: this.handleClearFilters }, locale.filterReset))); return /*#__PURE__*/_react["default"].createElement(_dropdown["default"], (0, _extends2["default"])({}, dropdownProps, { trigger: ['click'], overlay: menus, visible: this.neverShown ? false : visible, onVisibleChange: this.onVisibleChange, getPopupContainer: getPopupContainer, forceRender: true }), this.renderFilterIcon()); } }]); return FilterMenu; }(_react.Component); exports["default"] = FilterMenu; FilterMenu.defaultProps = { handleFilter: function handleFilter() {}, column: {} }; //# sourceMappingURL=filterDropdown.js.map