@krowdy-ui/views
Version:
React components that implement Google's Material Design.
502 lines (445 loc) • 17.7 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof3 = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _extends4 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _dayjs = _interopRequireDefault(require("@date-io/dayjs"));
var _dayjs2 = _interopRequireDefault(require("dayjs"));
var _es = _interopRequireDefault(require("dayjs/locale/es"));
var _pickers = require("@material-ui/pickers");
var _core = require("@krowdy-ui/core");
var _generateRandomId = _interopRequireDefault(require("../utils/generateRandomId"));
var _CategoryItems = _interopRequireDefault(require("./CategoryItems"));
var _InputChip = _interopRequireDefault(require("./InputChip"));
var _useFilterValidator = _interopRequireDefault(require("./useFilterValidator"));
var _TagCloudWords = _interopRequireDefault(require("./TagCloudWords"));
var _ListItems = _interopRequireDefault(require("./ListItems"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
var useStyles = (0, _core.makeStyles)(function (theme) {
return {
and: {
fontSize: 14,
margin: theme.spacing(0),
paddingLeft: theme.spacing(1)
},
applyFilterButton: {
marginTop: theme.spacing(2)
},
center: {
display: 'flex',
justifyContent: 'center'
},
configOptionContainer: {
padding: theme.spacing(2.5, 0)
},
firstInputContainer: {
alignItems: 'flex-end',
display: 'flex'
},
input: {
fontSize: 12
},
inputEndAdornment: {
fontSize: 12
},
menuItem: {
'&:hover': {
background: '#F3FBFF',
color: theme.palette.primary[500]
},
fontSize: 12,
transition: '.3s'
},
menuItemSelected: {
// '&&': {
// backgroundColor: '#F3FBFF'
// },
backgroundColor: '#F3FBFF',
color: theme.palette.primary[500]
},
secondInputContainer: {
paddingTop: theme.spacing(2)
},
select: {
fontSize: 12,
paddingBottom: theme.spacing(1),
paddingTop: theme.spacing(1)
},
selectPaper: {
borderRadius: 2
},
title: {
borderBottom: '1px solid',
borderBottomColor: theme.palette.grey[300],
fontSize: 12,
fontWeight: 'bold',
lineHeight: '20px',
marginTop: 0,
padding: theme.spacing(0.5, 0)
}
};
}, {
name: 'KrowdyFilterConfig'
});
var parseToValidDate = function parseToValidDate(date) {
if (date) return (0, _dayjs2["default"])(date).toISOString();
return null;
};
var FilterConfig = function FilterConfig(props) {
var filter = props.filter,
categoryItems = props.categoryItems,
onClickApply = props.onClickApply,
hasNextPage = props.hasNextPage,
_props$filterTypes = props.filterTypes,
filterTypes = _props$filterTypes === void 0 ? [] : _props$filterTypes,
listWidth = props.listWidth,
_props$edit = props.edit,
edit = _props$edit === void 0 ? false : _props$edit,
onSelectCategoryFilter = props.onSelectCategoryFilter,
loadMoreCategoryItems = props.loadMoreCategoryItems,
PaperProps = props.PaperProps,
_props$AddFiltersButt = props.AddFiltersButtonProps,
AddFiltersButtonProps = _props$AddFiltersButt === void 0 ? {} : _props$AddFiltersButt;
var classes = useStyles();
var _useState = (0, _react.useState)(filter.optionIndex || 0),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
optionIndex = _useState2[0],
setOptionIndex = _useState2[1];
var type = filterTypes.find(function (f) {
return f.type === filter.type;
});
var option = type.options[optionIndex];
var _useState3 = (0, _react.useState)(function () {
if (!type) return null;
if (filter.value && option.numberOfInputs) switch (filter.type) {
case 'number':
case 'date':
switch (option.operator) {
case '$range':
var _filter$value = (0, _slicedToArray2["default"])(filter.value, 2),
first = _filter$value[0],
second = _filter$value[1];
return {
first: first,
second: second
};
default:
return (0, _extends4["default"])({}, type.initialValue, {
first: filter.value,
second: ''
});
}
case 'list':
case 'category':
case 'keyword':
case 'generic':
return filter.value;
default:
return type.initialValue;
}
return type.initialValue;
}),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
filterConfig = _useState4[0],
setFilterConfig = _useState4[1];
var errors = (0, _useFilterValidator["default"])(filterConfig, filter.type, option);
if (!type) return null;
var getFilterConfigValue = function getFilterConfigValue(filterType) {
switch (filterType) {
case 'number':
if (option.numberOfInputs === 1) return filterConfig.first;else if (option.numberOfInputs === 2) return [filterConfig.first, filterConfig.second];
return null;
case 'date':
if (option.numberOfInputs === 1) return parseToValidDate(filterConfig.first);else if (option.numberOfInputs === 2) return [parseToValidDate(filterConfig.first), parseToValidDate(filterConfig.second)];
return null;
case 'list':
case 'generic':
case 'category':
case 'keyword':
return filterConfig;
default:
return null;
}
};
var _handleOptionChange = function _handleOptionChange(event) {
setOptionIndex(event.target.value);
};
var _handleChange = function _handleChange(key) {
return function (eventOrValue) {
if (eventOrValue && (0, _typeof2["default"])(eventOrValue) === 'object' && eventOrValue.target) eventOrValue.persist();
switch (filter.type) {
case 'number':
setFilterConfig(function (prev) {
return (0, _extends4["default"])({}, prev, (0, _defineProperty2["default"])({}, key, eventOrValue.target.value));
});
break;
case 'date':
setFilterConfig(function (prev) {
return (0, _extends4["default"])({}, prev, (0, _defineProperty2["default"])({}, key, eventOrValue));
});
break;
case 'list':
case 'generic':
case 'category':
case 'keyword':
setFilterConfig(eventOrValue);
break;
default:
break;
}
};
};
var _handleClickApply = function _handleClickApply() {
var configValue = getFilterConfigValue(filter.type);
var _id = edit ? filter._id : (0, _generateRandomId["default"])();
onClickApply({
_id: _id,
key: filter.key,
label: filter.label,
operator: option.operator,
operatorLabel: option.label,
optionIndex: optionIndex,
queryBase: filter.queryBase,
reference: filter.reference,
type: filter.type,
value: configValue
});
};
var _handleLoadMoreItems = function _handleLoadMoreItems(categoryKey) {
return function () {
loadMoreCategoryItems(categoryKey);
};
};
var renderConfigOption = function renderConfigOption(filterType, optionIndex) {
var showInputs = type.options[optionIndex].numberOfInputs > 0;
if (!showInputs) return null;
var showSecondInput = type.options[optionIndex].numberOfInputs === 2;
switch (filterType) {
case 'number':
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
className: classes.firstInputContainer
}, /*#__PURE__*/_react["default"].createElement(_core.TextField // error={Boolean(errors && errors.first)}
, {
fullWidth: true // helperText={errors && errors.first}
,
InputProps: {
classes: {
input: classes.input
}
},
onChange: _handleChange('first'),
placeholder: "Valor",
size: "small",
type: "number",
value: filterConfig.first
}), showSecondInput && /*#__PURE__*/_react["default"].createElement("p", {
className: classes.and
}, "y")), showSecondInput && /*#__PURE__*/_react["default"].createElement("div", {
className: classes.secondInputContainer
}, /*#__PURE__*/_react["default"].createElement(_core.TextField // error={Boolean(errors && errors.second)}
, {
fullWidth: true // helperText={errors && errors.second}
,
InputProps: {
classes: {
input: classes.input
}
},
onChange: _handleChange('second'),
placeholder: "Valor",
size: "small",
type: "number",
value: filterConfig.second
})));
case 'keyword':
return /*#__PURE__*/_react["default"].createElement(_TagCloudWords["default"], {
categoryKey: filter.key,
hasNextPage: hasNextPage,
items: categoryItems,
listWidth: listWidth,
loadMore: _handleLoadMoreItems(filter.key),
onChangeSelected: _handleChange(),
onResetCategoryItems: onSelectCategoryFilter,
PaperProps: PaperProps,
selectedItems: filterConfig
});
case 'generic':
return /*#__PURE__*/_react["default"].createElement(_InputChip["default"], {
onChange: _handleChange(),
values: filterConfig
});
case 'date':
return /*#__PURE__*/_react["default"].createElement(_pickers.MuiPickersUtilsProvider, {
locale: _es["default"],
utils: _dayjs["default"]
}, /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
className: classes.firstInputContainer
}, /*#__PURE__*/_react["default"].createElement(_pickers.KeyboardDatePicker, {
format: "DD/MM/YYYY",
fullWidth: true // {...(
// errors && errors.first ?
// {
// error : true,
// helperText: errors.first
// } :
// {}
// )}
,
initialFocusedDate: (0, _dayjs2["default"])(new Date()).minute(0).second(0).format(),
InputAdornmentProps: {
classes: {
root: classes.inputEndAdornment
}
},
InputProps: {
classes: {
input: classes.input
}
},
maxDateMessage: "El rango es incorrecto",
minDateMessage: "El rango es incorrecto",
onChange: _handleChange('first'),
placeholder: "DD/MM/AAAA",
size: "small",
value: filterConfig.first
}), showSecondInput && /*#__PURE__*/_react["default"].createElement("p", {
className: classes.and
}, "y")), showSecondInput && /*#__PURE__*/_react["default"].createElement("div", {
className: classes.secondInputContainer
}, /*#__PURE__*/_react["default"].createElement(_pickers.KeyboardDatePicker, {
format: "DD/MM/YYYY",
fullWidth: true // {...(
// errors && errors.second ?
// {
// error : true,
// helperText: errors.second
// } :
// {}
// )}
,
initialFocusedDate: (0, _dayjs2["default"])(new Date()).minute(0).second(0).format(),
InputAdornmentProps: {
classes: {
root: classes.inputEndAdornment
}
},
InputProps: {
classes: {
input: classes.input
}
},
maxDateMessage: "El rango es incorrecto",
minDate: filterConfig.first,
minDateMessage: "El rango es incorrecto",
onChange: _handleChange('second'),
placeholder: "DD/MM/AAAA",
size: "small",
value: filterConfig.second
}))));
case 'category':
return /*#__PURE__*/_react["default"].createElement(_CategoryItems["default"], {
categoryKey: filter.key,
hasNextPage: hasNextPage,
items: categoryItems,
listWidth: listWidth,
loadMore: _handleLoadMoreItems(filter.key),
onChangeSelected: _handleChange(),
onResetCategoryItems: onSelectCategoryFilter,
selectedItems: filterConfig
});
case 'list':
return /*#__PURE__*/_react["default"].createElement(_ListItems["default"], {
categoryKey: filter.key,
items: categoryItems,
listWidth: listWidth,
onChangeSelected: _handleChange(),
onResetCategoryItems: onSelectCategoryFilter,
selectedItems: filterConfig
});
default:
return null;
}
};
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("p", {
className: classes.title
}, filter.label), /*#__PURE__*/_react["default"].createElement(_core.FormControl, {
color: "primary",
fullWidth: true,
variant: "outlined"
}, /*#__PURE__*/_react["default"].createElement(_core.Select, {
classes: {
root: classes.select
},
color: "primary",
disabled: filter.type === 'list',
MenuProps: {
anchorOrigin: {
horizontal: 'left',
vertical: 'bottom'
},
classes: {
paper: classes.selectPaper
},
getContentAnchorEl: null
},
onChange: _handleOptionChange,
value: optionIndex
}, type.options.map(function (option, index) {
return /*#__PURE__*/_react["default"].createElement(_core.MenuItem, {
classes: {
root: classes.menuItem,
selected: classes.menuItemSelected
},
key: index,
value: index
}, option.label);
}))), /*#__PURE__*/_react["default"].createElement("div", {
className: classes.configOptionContainer
}, renderConfigOption(filter.type, optionIndex)), /*#__PURE__*/_react["default"].createElement("div", {
className: classes.center
}, /*#__PURE__*/_react["default"].createElement(_core.Button, (0, _extends4["default"])({
className: classes.applyFilterButton,
color: "primary",
disabled: Boolean(errors),
onClick: _handleClickApply
}, AddFiltersButtonProps), "Aplicar filtros")));
};
process.env.NODE_ENV !== "production" ? FilterConfig.propTypes = {
AddFiltersButtonProps: _propTypes["default"].object,
categoryItems: _propTypes["default"].arrayOf(_propTypes["default"].shape({
_id: _propTypes["default"].string.isRequired,
label: _propTypes["default"].string.isRequired
})).isRequired,
edit: _propTypes["default"].bool,
filter: _propTypes["default"].shape({
_id: _propTypes["default"].string.isRequired,
key: _propTypes["default"].string.isRequired,
label: _propTypes["default"].string.isRequired,
type: _propTypes["default"].string.isRequired
}),
filterToEdit: _propTypes["default"].shape({
_id: _propTypes["default"].string.isRequired,
key: _propTypes["default"].string.isRequired,
label: _propTypes["default"].string.isRequired,
operator: _propTypes["default"].string.isRequired,
operatorLabel: _propTypes["default"].string.isRequired,
optionIndex: _propTypes["default"].number.isRequired,
type: _propTypes["default"].string.isRequired,
value: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number, _propTypes["default"].array])
}),
hasNextPage: _propTypes["default"].bool.isRequired,
loadMoreCategoryItems: _propTypes["default"].func.isRequired,
onClickApply: _propTypes["default"].func.isRequired,
onSelectCategoryFilter: _propTypes["default"].func
} : void 0;
var _default = FilterConfig;
exports["default"] = _default;