UNPKG

@6thquake/react-material

Version:

React components that implement Google's Material Design.

588 lines (520 loc) 16.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.styles = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); 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 _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _withStyles = _interopRequireDefault(require("../styles/withStyles")); var _AppBar = _interopRequireDefault(require("../AppBar")); var _MenuItem = _interopRequireDefault(require("../MenuItem")); var _MenuList = _interopRequireDefault(require("../MenuList")); var _Typography = _interopRequireDefault(require("../Typography")); var _Paper = _interopRequireDefault(require("../Paper")); var _isEqual = _interopRequireDefault(require("lodash/isEqual")); var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep")); var _KeyboardArrowDown = _interopRequireDefault(require("@material-ui/icons/KeyboardArrowDown")); var _KeyboardArrowUp = _interopRequireDefault(require("@material-ui/icons/KeyboardArrowUp")); var _FilterList = _interopRequireDefault(require("@material-ui/icons/FilterList")); var _SwipeableDrawer = _interopRequireDefault(require("../SwipeableDrawer")); var _ActionFilter = _interopRequireDefault(require("./ActionFilter")); var dropDownStyle = function dropDownStyle(theme) { return { root: { position: 'absolute', width: '100%', top: 0, backgroundColor: 'inherit', boxSizing: 'content-box', zIndex: theme.zIndex.appBar - 1 }, menuList: { zIndex: theme.zIndex.appBar, position: 'relative' }, menuItem: { backgroundColor: theme.palette.primary.main, '& $primary, & $icon': { color: theme.palette.common.white } }, mask: { width: '100vh', height: '100vh', position: 'fixed', opacity: 0, background: 'black', left: 0, top: 0, zIndex: theme.zIndex.appBar - 1 } }; }; function DropDown(_ref) { var theme = _ref.theme, onClose = _ref.onClose, onChange = _ref.onChange, classes = _ref.classes, value = _ref.value, _ref$options = _ref.options, options = _ref$options === void 0 ? [] : _ref$options; return _react.default.createElement(_Paper.default, { square: true, elevation: 1, className: classes.root }, _react.default.createElement(_MenuList.default, { className: classes.menuList }, options.map(function (item) { var active = item.value === value; return _react.default.createElement(_MenuItem.default, { onClick: function onClick() { onChange(item.value); }, key: item.value, className: active ? classes.menuItem : '' }, _react.default.createElement(_Typography.default, { style: { color: active ? theme.palette.common.white : '' }, variant: 'body1' }, item.label)); })), _react.default.createElement("div", { className: classes.mask, onClick: onClose })); } var StyledDropDown = (0, _withStyles.default)(dropDownStyle, { name: 'RMDropDown', withTheme: true })(DropDown); var styles = function styles(theme) { return { root: { position: 'relative', 'box-sizing': 'border-box', backgroundColor: theme.palette.background.paper }, bar: { display: 'flex', flex: 1, justifyContent: 'space-between', alignItems: 'center', padding: "".concat(theme.spacing(1.5), "px ").concat(theme.spacing(1), "px"), zIndex: theme.zIndex.appBar }, leftBox: { display: 'flex' }, left: { display: 'flex', alignItems: 'center', paddingRight: theme.spacing(0.5) }, label: { paddingLeft: theme.spacing(1) }, leftPriority: { display: 'flex', alignItems: 'center' }, slots: { display: 'flex', flex: 1, alignItems: 'center' }, rightBox: { display: 'flex', alignItems: 'center', paddingLeft: theme.spacing(0.5), justifyContent: 'flex-end' }, right: { alignItems: 'center', display: 'flex' }, rightPriority: { alignItems: 'center', display: 'flex' }, item: { marginRight: theme.spacing(1) }, menuBox: { position: 'relative', backgroundColor: 'inherit', width: '100%' } }; }; exports.styles = styles; var ActionBar = /*#__PURE__*/ function (_React$Component) { (0, _inherits2.default)(ActionBar, _React$Component); function ActionBar(_props) { var _this; (0, _classCallCheck2.default)(this, ActionBar); _this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(ActionBar).call(this, _props)); _this.init = function (props) { var filters = props.filters, sorts = props.sorts; var _filters = (0, _cloneDeep.default)(filters); var _sorts = (0, _cloneDeep.default)(sorts); var priorityFilters = []; var selectedFilters = []; _filters.forEach(function (filter, i) { var label = filter.label, value = filter.value, data = filter.data; var datas = []; data.forEach(function (item, j) { if (item.priority) { item.i = i; item.j = j; priorityFilters.push(item); } if (item.active) { datas.push(item); } }); if (datas.length > 0) { selectedFilters.push({ label: label, value: value, data: datas }); } }); var prioritySorts = []; var normalSorts = []; var value = ''; _sorts.forEach(function (item) { if (item.priority) { prioritySorts.push(item); } else { normalSorts.push(item); } if (item.active) { value = item.value; } }); _this.setState({ value: value, prioritySorts: prioritySorts, normalSorts: normalSorts, priorityFilters: priorityFilters, selectedFilters: selectedFilters }); }; _this.filter = null; _this.refFilter = function (node) { return _this.filter = node; }; _this.handleTitleClick = function (e) { var expanded = _this.state.expanded; _this.setState({ expanded: !expanded }); }; _this.handleChange = function (value) { var _this$state = _this.state, normalSorts = _this$state.normalSorts, prioritySorts = _this$state.prioritySorts; normalSorts.forEach(function (item) { if (item.value === value) { item.active = true; } else { item.active = false; } }); prioritySorts.forEach(function (item) { item.active = false; }); _this.setState({ value: value, expanded: false }, function () { _this.onChange(); }); }; _this.handleSiftingClick = function () { _this.setState({ open: true, expanded: false }); }; _this.handleFilterChange = function (e) { var priorityFilters = []; e.forEach(function (filter, i) { filter.data.forEach(function (item, j) { if (item.priority) { item.i = i; item.j = j; priorityFilters.push(item); } }); }); _this.setState({ priorityFilters: priorityFilters }); }; _this.handleFilterOk = function (e) { _this.setState({ selectedFilters: e, open: false }, function () { _this.onChange(); }); }; _this.handleFilterReset = function (e) { _this.setState({ selectedFilters: e }, function () { _this.onChange(); }); }; _this.onChange = function () { var _this$props = _this.props, onChange = _this$props.onChange, sorts = _this$props.sorts; var _this$state2 = _this.state, selectedFilters = _this$state2.selectedFilters, value = _this$state2.value; var data = { sort: sorts.filter(function (item) { return item.value === value; })[0], filters: selectedFilters }; onChange(data); }; _this.handleDrawerClose = function () { _this.setState({ open: false }); }; _this.handleDropDownClose = function () { _this.setState({ expanded: false }); }; _this.handleDrawerClose = function () { _this.setState({ open: false }); }; _this.domRef = _react.default.createRef(); _this.state = { expanded: false, open: false, value: '' }; return _this; } (0, _createClass2.default)(ActionBar, [{ key: "componentDidMount", value: function componentDidMount() { this.init(this.props); } }, { key: "componentWillReceiveProps", value: function componentWillReceiveProps(nextProps) { var _this$props2 = this.props, filter = _this$props2.filter, sorts = _this$props2.sorts; if (!(0, _isEqual.default)(nextProps.filter, filter) || !(0, _isEqual.default)(nextProps.sorts, sorts)) { this.init(nextProps); } } }, { key: "handlePriorities", value: function handlePriorities(index) { var _this2 = this; var _this$state3 = this.state, normalSorts = _this$state3.normalSorts, prioritySorts = _this$state3.prioritySorts; var value = null; prioritySorts.forEach(function (item, i) { if (i === index) { item.active = true; value = item.value; } else { item.active = false; } }); normalSorts.forEach(function (item) { item.active = false; }); this.setState({ value: value, expanded: false }, function () { _this2.onChange(); }); } }, { key: "handleFilters", value: function handleFilters(i, j) { this.filter.handleClick(i, j, true); } }, { key: "render", value: function render() { var _this3 = this; var _this$props3 = this.props, classes = _this$props3.classes, theme = _this$props3.theme, filters = _this$props3.filters, AppBarProps = _this$props3.AppBarProps, children = _this$props3.children; var iOS = process.browser && /iPad|iPhone|iPod/.test(navigator.userAgent); var _this$state4 = this.state, expanded = _this$state4.expanded, value = _this$state4.value, open = _this$state4.open; var _this$state5 = this.state, _this$state5$selected = _this$state5.selectedFilters, selectedFilters = _this$state5$selected === void 0 ? [] : _this$state5$selected, _this$state5$priority = _this$state5.priorityFilters, priorityFilters = _this$state5$priority === void 0 ? [] : _this$state5$priority, _this$state5$normalSo = _this$state5.normalSorts, normalSorts = _this$state5$normalSo === void 0 ? [] : _this$state5$normalSo, _this$state5$priority2 = _this$state5.prioritySorts, prioritySorts = _this$state5$priority2 === void 0 ? [] : _this$state5$priority2; var multiLength = selectedFilters.reduce(function (r, next) { return r + next.data.length; }, 0); var selectedSort = normalSorts.filter(function (item) { return item.value === value; })[0] || { label: '排序', active: false, value: value }; var ArrowIcon = expanded ? _KeyboardArrowDown.default : _KeyboardArrowUp.default; return _react.default.createElement(_AppBar.default, (0, _extends2.default)({ elevation: 1, position: "static", color: "default", className: classes.root }, AppBarProps), _react.default.createElement("div", { className: classes.bar }, _react.default.createElement("div", { className: classes.leftBox }, _react.default.createElement("div", { onClick: this.handleTitleClick, className: classes.left }, _react.default.createElement(_Typography.default, { style: { color: selectedSort.active ? theme.palette.primary.main : '' }, className: classes.label, variant: "body1" }, selectedSort.label), _react.default.createElement(ArrowIcon, { color: selectedSort.active ? 'primary' : 'inherit' })), _react.default.createElement("div", { className: classes.leftPriority }, prioritySorts.map(function (item, index) { var color = item.active ? theme.palette.primary.main : ''; var className = item.active ? 'body2' : 'body1'; return _react.default.createElement("div", { key: item.value, className: classes.item, onClick: _this3.handlePriorities.bind(_this3, index) }, _react.default.createElement(_Typography.default, { style: { color: color }, variant: className }, item.label)); }))), _react.default.createElement("div", { className: classes.slots }, children), _react.default.createElement("div", { className: classes.rightBox }, _react.default.createElement("div", { className: classes.rightPriority }, priorityFilters.map(function (item, index) { var color = item.active ? theme.palette.primary.main : ''; var className = item.active ? 'body2' : 'body1'; return _react.default.createElement("div", { key: item.value, className: classes.item, onClick: _this3.handleFilters.bind(_this3, item.i, item.j) }, _react.default.createElement(_Typography.default, { style: { color: color }, variant: className }, item.label)); })), _react.default.createElement("div", { className: classes.right }, _react.default.createElement("div", { onClick: this.handleSiftingClick, className: classes.left }, _react.default.createElement(_Typography.default, { color: multiLength ? 'primary' : '', className: classes.label, variant: multiLength > 0 ? 'body2' : 'body1' }, "\u7B5B\u9009", multiLength ? "(".concat(multiLength, ")") : ''), _react.default.createElement(_FilterList.default, { color: multiLength > 0 ? 'primary' : 'inherit' }))))), expanded && _react.default.createElement("div", { className: classes.menuBox }, _react.default.createElement(StyledDropDown, { onClose: this.handleDropDownClose, onChange: this.handleChange, options: normalSorts, value: value })), _react.default.createElement(_SwipeableDrawer.default, { variant: "persistent", disableBackdropTransition: !iOS, disableDiscovery: iOS, onClose: this.handleDrawerClose, anchor: "right", open: open }, _react.default.createElement(_ActionFilter.default, { data: filters, onOk: this.handleFilterOk, onReset: this.handleFilterReset, onChange: this.handleFilterChange, innerRef: this.refFilter }))); } }]); return ActionBar; }(_react.default.Component); ActionBar.propTypes = { /** * items of filters */ filters: _propTypes.default.array, /** * data of sort bar */ sorts: _propTypes.default.array, /** * Callback fired when the selected data to be changed. */ onChange: _propTypes.default.func, /** * Props of AppBar */ AppBarProps: _propTypes.default.object }; ActionBar.defaultProps = { onChange: function onChange() {}, filters: [], sorts: [], AppBarProps: {} }; var _default = (0, _withStyles.default)(styles, { name: 'RMActionBar', withTheme: true })(ActionBar); exports.default = _default;