choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
349 lines (291 loc) • 12.6 kB
JavaScript
"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