@6thquake/react-material
Version:
React components that implement Google's Material Design.
473 lines (406 loc) • 14.3 kB
JavaScript
"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;