UNPKG

@krowdy-ui/views

Version:

React components that implement Google's Material Design.

244 lines (227 loc) 7.44 kB
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray"; import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray"; import React, { useState, useEffect, useMemo } from 'react'; import clsx from 'clsx'; import { Dialog, DialogContent, makeStyles, DialogTitle, Typography, IconButton, Button, DialogActions, CircularProgress } from '@krowdy-ui/core'; import { Close as CloseIcon } from '@material-ui/icons'; import InputChip from './InputChip'; import PropTypes from 'prop-types'; import { generateRandomId } from '../utils'; var transform = function transform(Interval1, Interval2, x) { return Math.round((x - Interval1.min) / (Interval1.max - Interval1.min) * (Interval2.max - Interval2.min) + Interval2.min); }; var _ref2 = /*#__PURE__*/React.createElement(Typography, { variant: "h6" }, "Nube de palabras"); var _ref3 = /*#__PURE__*/React.createElement(CloseIcon, { fontSize: "small" }); var KeywordFilter = function KeywordFilter(_ref) { var _ref$onResetCategoryI = _ref.onResetCategoryItems, onResetCategoryItems = _ref$onResetCategoryI === void 0 ? function () {} : _ref$onResetCategoryI, _ref$loadMore = _ref.loadMore, loadMore = _ref$loadMore === void 0 ? function () {} : _ref$loadMore, _ref$items = _ref.items, items = _ref$items === void 0 ? [] : _ref$items, _ref$PaperProps = _ref.PaperProps, PaperProps = _ref$PaperProps === void 0 ? {} : _ref$PaperProps, _ref$filter = _ref.filter, filter = _ref$filter === void 0 ? {} : _ref$filter, edit = _ref.edit, onClickApply = _ref.onClickApply, isOpen = _ref.isOpen, isLoading = _ref.isLoading, onClose = _ref.onClose; var classes = useStyles(); var _useState = useState(filter.value || []), _useState2 = _slicedToArray(_useState, 2), selectedItems = _useState2[0], setSelectedItems = _useState2[1]; var _handleClose = function _handleClose() { setSelectedItems([]); onClose(); }; useEffect(function () { if (isOpen) { var key = filter.key, value = filter.value; if (value) setSelectedItems(value); onResetCategoryItems(key); loadMore(key); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [isOpen]); var tags = useMemo(function () { var max = items.reduce(function (r, a) { return Math.max(r, a.count); }, 1); var min = items.reduce(function (r, a) { return Math.min(r, a.count); }, Infinity); var rangeDataSource = { max: max, min: min }; return _toConsumableArray(items.map(function (element) { return { _id: element._id, count: transform(rangeDataSource, { max: 35, min: 12 }, element.count), value: element.label }; })).sort(function (a, b) { return b.count - a.count; }); // eslint-disable-next-line react-hooks/exhaustive-deps }, [items]); var _handleClickTag = function _handleClickTag(tag) { var existsValue = selectedItems.includes(tag.value); // Don't add if value already exists if (!existsValue) setSelectedItems(selectedItems.concat(tag.value)); }; var _handleChangeInput = function _handleChangeInput(items) { setSelectedItems(items); }; var _handleClickApply = function _handleClickApply() { var configValue = selectedItems; var _id = edit ? filter._id : generateRandomId(); onClickApply({ _id: _id, key: filter.key, label: filter.label, operator: '$regex', operatorLabel: 'Contiene exactamente', optionIndex: filter.optionIndex, queryBase: filter.queryBase, reference: filter.reference, type: filter.type, value: configValue }); setSelectedItems([]); }; return /*#__PURE__*/React.createElement(Dialog, { fullWidth: true, onClose: _handleClose, open: isOpen, PaperProps: PaperProps }, /*#__PURE__*/React.createElement(DialogTitle, { className: classes.dialogTitleContainer, disableTypography: true }, _ref2, /*#__PURE__*/React.createElement(IconButton, { "aria-label": "close", className: classes.closeButton, onClick: _handleClose, size: "small" }, _ref3)), /*#__PURE__*/React.createElement(DialogContent, { className: classes.tagCloudWordsContainer }, /*#__PURE__*/React.createElement(InputChip, { onChange: _handleChangeInput, values: selectedItems }), /*#__PURE__*/React.createElement("div", { className: classes.tagsContainer }, isLoading ? /*#__PURE__*/React.createElement(CircularProgress, { className: classes.loading, size: 40 }) : tags.map(function (tag) { return /*#__PURE__*/React.createElement(CloudTag, { key: tag._id, onClick: _handleClickTag, selectedTags: selectedItems, tag: tag }); }))), /*#__PURE__*/React.createElement(DialogActions, { className: classes.dialogActionsContainer }, /*#__PURE__*/React.createElement(Button, { className: classes.applyButton, color: "primary", onClick: _handleClickApply, size: "large", variant: "outlined" }, "Aplicar filtro"))); }; var CloudTag = function CloudTag(_ref4) { var tag = _ref4.tag, _onClick = _ref4.onClick, selectedTags = _ref4.selectedTags; var count = tag.count, value = tag.value; var classes = useStyles({ count: count }); var selected = useMemo(function () { return selectedTags.includes(tag.value); }, [selectedTags, tag.value]); return /*#__PURE__*/React.createElement("span", { className: clsx(classes.cloudTag, selected && classes.selected), onClick: function onClick() { return _onClick(tag); } }, value); }; var useStyles = makeStyles(function (theme) { return { applyButton: { marginTop: 20 }, button: { marginTop: 12 }, closeButton: { color: theme.palette.grey[500], position: 'absolute', right: theme.spacing(1), top: theme.spacing(1) }, cloudTag: { color: theme.palette.secondary[500], cursor: 'pointer', display: 'inline-block', fontSize: function fontSize(_ref5) { var count = _ref5.count; return count; }, // color : ({ color }) => color, fontWeight: 300, margin: theme.spacing(0, .5) }, dialogActionsContainer: { justifyContent: 'center' }, dialogTitleContainer: { margin: 0, padding: theme.spacing(2) }, loading: { marginTop: theme.spacing(1) }, selected: { color: theme.palette.primary.main, fontWeight: 500 }, tagCloudWordsContainer: { height: 420, textAlign: 'center' }, tagsContainer: { marginTop: 12 } }; }); process.env.NODE_ENV !== "production" ? KeywordFilter.propTypes = { PaperProps: PropTypes.object, edit: PropTypes.bool, filter: PropTypes.shape({ _id: PropTypes.string.isRequired, key: PropTypes.string.isRequired, label: PropTypes.string.isRequired, type: PropTypes.string.isRequired }), items: PropTypes.arrayOf(PropTypes.shape({ _id: PropTypes.string.isRequired, count: PropTypes.number.isRequired, label: PropTypes.string })).isRequired, loadMore: PropTypes.func.isRequired, onClickApply: PropTypes.func.isRequired, onResetCategoryItems: PropTypes.func.isRequired } : void 0; export default KeywordFilter;