UNPKG

@6thquake/react-material

Version:

React components that implement Google's Material Design.

473 lines (406 loc) 14.3 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _withStyles = _interopRequireDefault(require("../styles/withStyles")); var _Chip = _interopRequireDefault(require("../Chip")); var _isFunction = _interopRequireDefault(require("lodash/isFunction")); var _classnames = _interopRequireDefault(require("classnames")); var _colorManipulator = require("../styles/colorManipulator"); var _ExpandMore = _interopRequireDefault(require("@material-ui/icons/ExpandMore")); var _ExpandLess = _interopRequireDefault(require("@material-ui/icons/ExpandLess")); var _IconButton = _interopRequireDefault(require("../IconButton")); var _Collapse = _interopRequireDefault(require("../Collapse")); var _LocaleProvider = require("../LocaleProvider"); /** * @ignore - do not document. */ // 颜色需要替换 var style = function style(theme) { var transition = { duration: theme.transitions.duration.shortest }; return { root: (0, _defineProperty2.default)({ display: 'flex', flexWrap: 'nowrap', // padding: theme.spacing(1), padding: theme.spacing(1) }, "display", 'flex'), spacer: { flex: 1 }, scroll: { display: 'flex', overflowX: 'auto' }, right: {}, label: { fontFamily: theme.typography.fontFamily, fontSize: theme.typography.pxToRem(15), color: theme.palette.text.primary, textAlign: 'left', lineHeight: '48px' }, labelDefault: { color: theme.palette.common.white }, item: { color: theme.palette.text.primary, backgroundColor: 'transparent' }, colorDefault: { color: theme.palette.common.white, backgroundColor: theme.palette.primary.dark }, clickableColorDefault: { backgroundColor: theme.palette.primary.dark, color: theme.palette.getContrastText(theme.palette.primary.dark), '&:hover, &:focus': { backgroundColor: "".concat((0, _colorManipulator.emphasize)(theme.palette.primary.dark, 0.08), " !important") }, '&:active': { backgroundColor: "".concat((0, _colorManipulator.emphasize)(theme.palette.primary.dark, 0.12), " !important") } }, /* Styles applied to the root element if `color="primary"`. */ colorPrimary: { backgroundColor: theme.palette.primary.dark, color: theme.palette.primary.contrastText }, /* Styles applied to the root element if `color="secondary"`. */ colorSecondary: { backgroundColor: theme.palette.secondary.dark, color: theme.palette.primary.contrastText }, clickable: { WebkitTapHighlightColor: 'transparent', // Remove grey highlight cursor: 'pointer', '&:hover, &:focus': {// backgroundColor: emphasize(theme.palette.common.white, 0.08), }, '&:active': { boxShadow: theme.shadows[1], backgroundColor: (0, _colorManipulator.emphasize)(theme.palette.common.white, 0.12) } }, /** * Styles applied to the root element if * `onClick` and `color="primary"` is defined or `clickable={true}`. */ clickableColorPrimary: { '&:hover, &:focus': { backgroundColor: (0, _colorManipulator.emphasize)(theme.palette.primary.dark, 0.08) }, '&:active': { // backgroundColor: emphasize(theme.palette.primary.main, 0.12), backgroundColor: (0, _colorManipulator.emphasize)(theme.palette.primary.main, 0.08) } }, /** * Styles applied to the root element if * `onClick` and `color="secondary"` is defined or `clickable={true}`. */ clickableColorSecondary: { '&:hover, &:focus': { backgroundColor: (0, _colorManipulator.emphasize)(theme.palette.secondary.dark, 0.08) }, '&:active': { backgroundColor: (0, _colorManipulator.emphasize)(theme.palette.secondary.main, 0.12) } }, /* Styles applied to the `IconButton` component when `expandIcon` is supplied. */ expandIcon: { fontFamily: theme.typography.fontFamily, fontSize: theme.typography.pxToRem(15), color: theme.palette.text.primary, transform: 'rotate(0deg)', transition: theme.transitions.create('transform', transition), '&:hover': { // Disable the hover effect for the IconButton, // because a hover effect should apply to the entire Expand button and // not only to the IconButton. backgroundColor: 'transparent' }, '&$expanded': { transform: 'rotate(180deg)' } }, more: { display: 'flex' }, expandIconLabel: { fontFamily: theme.typography.fontFamily, fontSize: theme.typography.pxToRem(13), color: theme.palette.text.primary, whiteSpace: 'nowrap' // textAlign: 'right', // lineHeight: '48px', }, /* Styles applied to the root element if `expanded={true}`. */ expanded: {} }; }; var Filter = /*#__PURE__*/ function (_Component) { (0, _inherits2.default)(Filter, _Component); function Filter() { var _getPrototypeOf2; var _this; (0, _classCallCheck2.default)(this, Filter); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(Filter)).call.apply(_getPrototypeOf2, [this].concat(args))); _this.state = { expanded: false }; _this.onClick = function (selectItem) { return function () { var _this$props = _this.props, multiple = _this$props.multiple, onChange = _this$props.onChange, value = _this$props.value, mapper = _this$props.mapper, options = _this$props.options; var selectVal = (0, _isFunction.default)(mapper.value) ? mapper.value(selectItem, options) : selectItem[mapper.value]; var newVal; if (!multiple) { if (_this.isSelected(selectVal)) { newVal = []; } else { newVal = [selectVal]; } } else if (_this.isSelected(selectVal)) { newVal = value.filter(function (v) { return v !== selectVal; }); } else { newVal = [].concat((0, _toConsumableArray2.default)(value), [selectVal]); } onChange(newVal); }; }; _this.handleClear = function () { var onChange = _this.props.onChange; onChange([]); }; _this.handleToggle = function () { var expanded = _this.state.expanded; _this.setState({ expanded: !expanded }); }; _this.isSelected = function (value) { return _this.props.value.includes(value); }; return _this; } (0, _createClass2.default)(Filter, [{ key: "render", value: function render() { var _this2 = this; var _this$props2 = this.props, classes = _this$props2.classes, options = _this$props2.options, label = _this$props2.label, mapper = _this$props2.mapper, spacing = _this$props2.spacing, labelWidth = _this$props2.labelWidth, color = _this$props2.color, expandable = _this$props2.expandable, row = _this$props2.row, selectedColor = _this$props2.selectedColor, theme = _this$props2.theme, more = _this$props2.more, less = _this$props2.less, scrollX = _this$props2.scrollX; var expanded = this.state.expanded; var collapsedHeight = "".concat(48 * row, "px"); var labelCls = (0, _classnames.default)(classes.label); var textColor = theme.palette[color] ? theme.palette[color].contrastText : theme.palette.text.primary; var backgroundColor = theme.palette[color] ? theme.palette[color].main : 'transparent'; var IconComponent = expanded ? _ExpandLess.default : _ExpandMore.default; return _react.default.createElement("div", { className: classes.root, style: { backgroundColor: backgroundColor } }, _react.default.createElement("div", { item: true, className: labelCls }, _react.default.createElement("div", { style: { color: textColor, cursor: 'pointer', width: labelWidth }, onClick: this.handleClear }, label)), _react.default.createElement(_Collapse.default, { style: { overflowX: 'hidden' }, in: !expandable || expanded, collapsedHeight: collapsedHeight }, _react.default.createElement("div", { className: (0, _classnames.default)((0, _defineProperty2.default)({}, classes.scroll, scrollX)) }, options.map(function (option) { var chipLabel = (0, _isFunction.default)(mapper.label) ? mapper.label(option, options) : option[mapper.label]; var value = (0, _isFunction.default)(mapper.value) ? mapper.value(option, options) : option[mapper.value]; var isSelected = _this2.isSelected(value); var item = (0, _classnames.default)(classes.item, (0, _defineProperty2.default)({}, classes.colorDefault, selectedColor === 'default' && isSelected)); var chipTextColor = isSelected ? theme.palette.common.white : textColor; return _react.default.createElement(_Chip.default, { key: value, color: isSelected ? selectedColor : 'default', label: chipLabel, clickable: true, style: { margin: "8px ".concat(spacing, "px"), color: chipTextColor }, onClick: _this2.onClick(option), classes: { root: item, colorPrimary: classes.colorPrimary, colorSecondary: classes.colorSecondary, clickableColorPrimary: classes.clickableColorPrimary, clickableColorSecondary: classes.clickableColorSecondary } }); }))), _react.default.createElement("div", { className: classes.spacer }), _react.default.createElement("div", { className: classes.right }, _react.default.createElement("div", { className: classes.more }, !scrollX && expandable && options.length > 0 && _react.default.createElement(_IconButton.default, { className: (0, _classnames.default)(classes.expandIcon, {// [classes.expanded]: expanded, }), component: "div", onClick: this.handleToggle }, _react.default.createElement(IconComponent, { style: { color: textColor } }), _react.default.createElement("span", { className: classes.expandIconLabel, style: { color: textColor } }, expanded ? less : more))))); } }]); return Filter; }(_react.Component); Filter.propTypes = { /** * Override or extend the styles applied to the component. * See [CSS API](#css-api) below for more details. */ classes: _propTypes.default.object.isRequired, /** * background color. */ color: _propTypes.default.oneOf(['default', 'primary', 'secondary']), /** * if true , Filter is expandable */ expandable: _propTypes.default.bool, /** * label name of the Filter */ label: _propTypes.default.string, /** * label width */ labelWidth: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]), /** * @ignore */ less: _propTypes.default.string, /** * option item label and value, when assignment option by options */ mapper: _propTypes.default.shape({ label: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]), value: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]) }), /** * @ignore */ more: _propTypes.default.string, /** * a multiple select filter or single select filter */ multiple: _propTypes.default.bool, /** * callback to parent component when select option */ onChange: _propTypes.default.func, /** * data options. */ options: _propTypes.default.array, /** * when expandable is true, row is the default lines the Filter will display */ row: _propTypes.default.number, /** * when scrollX is true, there is a x scroll bar for Filter */ scrollX: _propTypes.default.bool, /** * the color of active items */ selectedColor: _propTypes.default.oneOf(['default', 'primary', 'secondary']), /** * spacing between items */ spacing: _propTypes.default.number, /** * @ignore */ theme: _propTypes.default.object, /** * The value of the Filter. */ value: _propTypes.default.array }; Filter.defaultProps = { color: 'default', selectedColor: 'primary', options: [], value: [], multiple: false, label: '', mapper: { label: 'label', value: 'value' }, onChange: function onChange() {}, spacing: 8, labelWidth: 'auto', expandable: false, row: 1, scrollX: false }; var _default = (0, _withStyles.default)(style, { name: 'RMFilter', withTheme: true })((0, _LocaleProvider.withLocale)({ name: 'Filter' })(Filter)); exports.default = _default;