@krowdy-ui/views
Version:
React components that implement Google's Material Design.
174 lines (162 loc) • 5.59 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import React from 'react';
import { Typography, Popover, Checkbox, Paper, withStyles } from '@krowdy-ui/core';
import { TreeView, TreeItem } from '@material-ui/lab';
import { ArrowDropDown as ArrowDropDownIcon, ArrowDropUp as ArrowDropUpIcon } from '@material-ui/icons';
import clsx from 'clsx';
import PropTypes from 'prop-types';
export var styles = {
containerPaper: {
padding: 12,
width: 300
},
flex: {
alignItems: 'center',
display: 'flex'
},
pointer: {
cursor: 'pointer'
}
};
var _ref4 = /*#__PURE__*/React.createElement(ArrowDropDownIcon, null);
var _ref5 = /*#__PURE__*/React.createElement(ArrowDropDownIcon, null);
var _ref7 = /*#__PURE__*/React.createElement(ArrowDropUpIcon, null);
var MultiCheckBox = function MultiCheckBox(_ref) {
var options = _ref.options,
_ref$onChange = _ref.onChange,
onChange = _ref$onChange === void 0 ? function () {} : _ref$onChange,
label = _ref.label,
classes = _ref.classes,
expandAllDefault = _ref.expandAllDefault;
var _React$useState = React.useState(null),
_React$useState2 = _slicedToArray(_React$useState, 2),
anchorEl = _React$useState2[0],
setAnchorEl = _React$useState2[1];
var _handleClick = function _handleClick(event) {
return options.length && setAnchorEl(event.currentTarget);
};
var handleClose = function handleClose() {
setAnchorEl(null);
};
var open = Boolean(anchorEl);
var _handleClickCheckBox = function _handleClickCheckBox(e) {
return e.stopPropagation();
};
var _handleClickOption = function _handleClickOption(key) {
return function (_ref2) {
var checked = _ref2.target.checked;
var newOptions = options.map(function (option) {
var isOptionSelected = option.key === key;
if (isOptionSelected) return _extends({}, option, {
checked: checked,
subOptions: option.subOptions.map(function (subOption) {
return _extends({}, subOption, {
checked: checked
});
})
});
var isSubOptionSelected = option.subOptions.some(function (subOption) {
return subOption.key === key;
});
if (!isSubOptionSelected) return option;
var newSubOptions = option.subOptions.map(function (subOption) {
if (subOption.key !== key) return subOption;
return _extends({}, subOption, {
checked: checked
});
});
return _extends({}, option, {
checked: newSubOptions.every(function (_ref3) {
var checked = _ref3.checked;
return checked;
}),
subOptions: newSubOptions
});
});
onChange(newOptions);
};
};
return /*#__PURE__*/React.createElement("div", {
className: classes.root
}, /*#__PURE__*/React.createElement("div", {
className: clsx(classes.flex, classes.pointer),
onClick: _handleClick
}, /*#__PURE__*/React.createElement(Typography, {
variant: "h6"
}, label), _ref4), /*#__PURE__*/React.createElement(Popover, {
anchorEl: anchorEl,
anchorOrigin: {
horizontal: 'right',
vertical: 'top'
},
onClose: handleClose,
open: open,
transformOrigin: {
horizontal: 'center',
vertical: 'bottom'
}
}, /*#__PURE__*/React.createElement(Paper, {
className: classes.containerPaper
}, /*#__PURE__*/React.createElement(TreeView, {
defaultCollapseIcon: _ref5,
defaultExpanded: expandAllDefault ? options.map(function (_ref6) {
var key = _ref6.key;
return key;
}) : undefined,
defaultExpandIcon: _ref7
}, options.map(function (option) {
var key = option.key,
subOptions = option.subOptions,
label = option.label;
return /*#__PURE__*/React.createElement(TreeItem, {
key: key,
label: /*#__PURE__*/React.createElement("div", {
className: classes.flex
}, /*#__PURE__*/React.createElement(Checkbox, {
checked: option.checked,
color: "primary",
onChange: _handleClickOption(option.key),
onClick: _handleClickCheckBox,
size: "small"
}), /*#__PURE__*/React.createElement(Typography, {
variant: "h6"
}, label)),
nodeId: key
}, subOptions && subOptions.map(function (subOption) {
var key = subOption.key,
label = subOption.label;
return /*#__PURE__*/React.createElement(TreeItem, {
key: key,
label: /*#__PURE__*/React.createElement("div", {
className: classes.flex
}, /*#__PURE__*/React.createElement(Checkbox, {
checked: subOption.checked,
color: "primary",
onChange: _handleClickOption(subOption.key),
onClick: _handleClickCheckBox,
size: "small"
}), /*#__PURE__*/React.createElement(Typography, null, label)),
nodeId: key
});
}));
})))));
};
process.env.NODE_ENV !== "production" ? MultiCheckBox.propTypes = {
classes: PropTypes.object,
label: PropTypes.string,
onChange: PropTypes.func,
options: PropTypes.arrayOf(PropTypes.shape({
checked: PropTypes.bool,
key: PropTypes.string,
label: PropTypes.string,
subOptions: PropTypes.arrayOf(PropTypes.shape({
checked: PropTypes.bool,
key: PropTypes.string,
label: PropTypes.string
}))
}))
} : void 0;
export default withStyles(styles, {
name: 'MultiCheckBox'
})(MultiCheckBox);