react-searchable-select
Version:
#### Developed By: Ashish Arora (GitId: ashisharora1998)
497 lines (483 loc) • 18.4 kB
JavaScript
'use strict';
var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
var material = require('@mui/material');
var styles = require('@mui/styles');
var React = require('react');
var styled = require('@emotion/styled');
var PropTypes = require('prop-types');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var _toConsumableArray__default = /*#__PURE__*/_interopDefault(_toConsumableArray);
var _slicedToArray__default = /*#__PURE__*/_interopDefault(_slicedToArray);
var React__default = /*#__PURE__*/_interopDefault(React);
var styled__default = /*#__PURE__*/_interopDefault(styled);
var PropTypes__default = /*#__PURE__*/_interopDefault(PropTypes);
var SELECT_CARET = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iNiIgdmlld0JveD0iMCAwIDEwIDYiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik04LjY2NjcxIDAuNzVMNS4wMDAwNCA0LjQxNjY3TDEuMzMzMzcgMC43NSIgc3Ryb2tlPSIjMUUxQzFCIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik04LjY2NjcxIDAuNzVMNS4wMDAwNCA0LjQxNjY3TDEuMzMzMzcgMC43NSIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLW9wYWNpdHk9IjAuNSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K";
var StyledMenuItem = styled__default.default(material.MenuItem)(function (_ref) {
_ref.theme;
return {
"&.MuiButtonBase-root": {
fontFamily: "Lato",
fontSize: "15px",
fontWeight: 400,
lineHeight: "22px",
letterSpacing: "0px",
textAlign: "left",
padding: "8px 16px 8px 16px",
borderRadius: "6px",
gap: "8px",
margin: "2px 5px"
}
// "&.MuiButtonBase-root:hover": {
// background: "orange",
// color: "white",
// },
};
});
var SearchMenuItem = styled__default.default(material.MenuItem)(function (_ref2) {
_ref2.theme;
return {
"&.MuiButtonBase-root": {
background: "transparent"
},
"&.MuiButtonBase-root:hover": {
background: "transparent"
}
};
});
var ScrollBox = styled__default.default(material.Box)(function (_ref3) {
_ref3.theme;
return {
"&.MuiBox-root": {
overflowY: "auto",
scrollbarColor: "grey",
scrollbarWidth: "thin"
},
"&.MuiBox-root::-webkit-scrollbar": {
width: "3px !important",
borderRadius: "5px"
},
"&.MuiBox-root::-webkit-scrollbar-track": {
background: "transparent"
},
"&.MuiBox-root::-webkit-scrollbar-thumb": {
background: "#888 !important"
}
};
});
var Search = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCAxOCAxOCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iNy41IiBjeT0iNy41IiByPSI1LjI1IiBzdHJva2U9IiMxRTFDMUIiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPGNpcmNsZSBjeD0iNy41IiBjeT0iNy41IiByPSI1LjI1IiBzdHJva2U9IndoaXRlIiBzdHJva2Utb3BhY2l0eT0iMC41IiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik0xNS43NSAxNS43NUwxMS4yNSAxMS4yNSIgc3Ryb2tlPSIjMUUxQzFCIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik0xNS43NSAxNS43NUwxMS4yNSAxMS4yNSIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLW9wYWNpdHk9IjAuNSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8L3N2Zz4K";
var CrossIcon = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMCAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE1IDVMNSAxNSIgc3Ryb2tlPSIjMUUxQzFCIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNMTUgNUw1IDE1IiBzdHJva2U9IndoaXRlIiBzdHJva2Utb3BhY2l0eT0iMC41IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNNSA1TDE1IDE1IiBzdHJva2U9IiMxRTFDMUIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik01IDVMMTUgMTUiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS1vcGFjaXR5PSIwLjUiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjwvc3ZnPgo=";
/** @format */
function SearchBar(_ref) {
var value = _ref.value,
onChange = _ref.onChange,
placeholder = _ref.placeholder;
_ref.isValid;
var onClear = _ref.onClear,
style = _ref.style,
_ref$disabled = _ref.disabled,
disabled = _ref$disabled === void 0 ? false : _ref$disabled;
return /*#__PURE__*/React__default.default.createElement(material.Box, null, /*#__PURE__*/React__default.default.createElement(material.TextField, {
value: value,
style: style,
sx: {
width: "100%"
},
onChange: onChange,
disabled: disabled,
placeholder: placeholder,
isValid: true,
InputProps: {
endAdornment: /*#__PURE__*/React__default.default.createElement(material.InputAdornment, {
position: "end"
}, value === "" ? /*#__PURE__*/React__default.default.createElement("img", {
src: Search,
alt: "search"
}) : /*#__PURE__*/React__default.default.createElement(material.IconButton, {
onClick: onClear,
sx: {
p: "8px 0"
}
}, /*#__PURE__*/React__default.default.createElement("img", {
src: CrossIcon,
alt: "clear"
})))
}
}));
}
var useStyles = styles.makeStyles(function (theme) {
return {
DropDownButton: {
margin: "50px 50px",
fontSize: "1.125rem",
width: "inherit",
height: "60px",
display: "flex",
alignItems: "center",
justifyContent: "space-between",
border: "2px solid #007bff",
borderRadius: "10px",
backgroundColor: "white",
cursor: "pointer",
padding: "0px 20px"
},
inputRoot: {
color: "inherit",
width: "100%"
},
search: {
position: "relative",
marginLeft: 0,
width: "100%"
},
searchIcon: {
// padding: theme.spacing(0, 2),
height: "100%",
position: "absolute",
pointerEvents: "none",
display: "flex",
alignItems: "center",
justifyContent: "center"
},
inputInput: {
// padding: theme.spacing(1, 1, 1, 0),
// paddingLeft: `calc(1em + ${theme.spacing(4)}px)`,
// transition: theme.transitions.create("width"),
width: "100%"
},
searchBarContainer: {
minWidth: "inherit",
display: "flex",
justifyContent: "space-evenly",
cursor: "default",
"&.MuiListItem-button": {
"&:hover": {
backgroundColor: "white"
}
}
},
menuDivider: {
margin: "0 20px"
},
dashboardSelectMenu: {
"& .MuiPopover-paper": {
minWidth: "inherit",
maxWidth: "fit-content",
borderRadius: "6px"
}
},
externalLinkIcon: {
borderLeft: "1px solid var(--color-gray-eighty-five)",
padding: "10px 0px 10px 10px",
color: "var(--color-primary)",
cursor: "pointer"
}
};
});
function containsObject(obj, list) {
var i;
for (i = 0; i < list.length; i++) {
if (list[i].value === obj.value) {
return true;
}
}
return false;
}
function SearchBoxSelect(props) {
var classes = useStyles();
var _useState = React.useState(null),
_useState2 = _slicedToArray__default.default(_useState, 2),
anchorEl = _useState2[0],
setAnchorEl = _useState2[1];
var _useState3 = React.useState(""),
_useState4 = _slicedToArray__default.default(_useState3, 2),
searchText = _useState4[0],
setSearchText = _useState4[1];
var _useState5 = React.useState(),
_useState6 = _slicedToArray__default.default(_useState5, 2),
selection = _useState6[0],
setSelection = _useState6[1];
var _useState7 = React.useState([]),
_useState8 = _slicedToArray__default.default(_useState7, 2),
selectOptions = _useState8[0],
setSelectOptions = _useState8[1];
var _useState9 = React.useState([]),
_useState10 = _slicedToArray__default.default(_useState9, 2),
multiSelection = _useState10[0],
setMultiSelection = _useState10[1];
React.useEffect(function () {
var array = [];
if (props.autoFormat) {
array = props.selectionList.map(function (tag) {
var label = [];
props.labelKeys.map(function (w) {
label.push(tag[w]);
});
return {
value: tag[props.valueKey],
label: label.join(" ")
};
});
} else {
array = _toConsumableArray__default.default(props.selectionList);
}
setSelectOptions(array);
}, [props.selectionList]);
React.useEffect(function () {
if (props.isMultiSelect) {
setMultiSelection(props.value);
} else {
setSelection(props.value);
}
}, [props.selectionList]);
var handleMenuOpen = function handleMenuOpen(event) {
setAnchorEl(event.currentTarget);
};
var handleClose = function handleClose(e) {
setSearchText("");
setAnchorEl(null);
};
var handleSelect = function handleSelect(e) {
props.onChange(e);
setSelection(e);
setSearchText("");
setAnchorEl(null);
};
var handleMultiSelect = function handleMultiSelect(e) {
var MultiSelection = _toConsumableArray__default.default(multiSelection);
if (MultiSelection.indexOf(e) > -1) {
MultiSelection.splice(MultiSelection.indexOf(e), 1);
} else {
MultiSelection.push(e);
}
setMultiSelection(MultiSelection);
props.onChange(MultiSelection);
};
var handleMultiSelectDelete = function handleMultiSelectDelete(e) {
var MultiSelection = _toConsumableArray__default.default(multiSelection);
MultiSelection.splice(MultiSelection.indexOf(e), 1);
setMultiSelection(MultiSelection);
props.onChange(MultiSelection);
};
return /*#__PURE__*/React__default.default.createElement("div", null, props.label && /*#__PURE__*/React__default.default.createElement(material.InputLabel, {
htmlFor: props.name,
required: props.isRequired,
className: "select-box-label"
}, props.label), /*#__PURE__*/React__default.default.createElement("div", {
className: "select-box",
id: props.name,
onClick: handleMenuOpen,
style: {
cursor: "pointer",
border: "1px solid #8e8d8d",
padding: "10px",
borderRadius: "6px",
display: "flex",
height: "38px",
justifyContent: "space-between",
alignItems: "center"
}
}, /*#__PURE__*/React__default.default.createElement("div", {
className: "label-value-div"
}, selection ? /*#__PURE__*/React__default.default.createElement(material.Typography, null, " ", selection.label) : /*#__PURE__*/React__default.default.createElement(material.Typography, {
color: "grey"
}, " ", props.placeholder)), /*#__PURE__*/React__default.default.createElement(material.Box, null, /*#__PURE__*/React__default.default.createElement("img", {
src: SELECT_CARET,
alt: "",
style: {
width: "14px",
transition: "all .2s ease",
transform: anchorEl ? "rotate(180deg)" : null
}
}))), props.isMultiSelect ? renderMultiSelectMenu() : renderSelectMenu(), /*#__PURE__*/React__default.default.createElement(material.Box, {
className: "chip-group",
sx: {
mt: 1
}
}, props.isMultiSelect && multiSelection.length && props.withChips > 0 ? multiSelection.map(function (select, key) {
return /*#__PURE__*/React__default.default.createElement(material.Chip, {
disabled: props.isDisabled,
label: select.label,
key: select.value,
deleteIcon: props.chipDeleteIcon,
onDelete: function onDelete() {
return handleMultiSelectDelete(select);
}
});
}) : null));
function renderSelectMenu() {
var displayOptions = selectOptions.map(function (item) {
if (item.label.toLowerCase().includes(searchText.toLowerCase())) {
return item;
}
return undefined;
}).filter(function (item) {
return item !== undefined;
});
function renderOption(value) {
if ((selection === null || selection === void 0 ? void 0 : selection.value) === (value === null || value === void 0 ? void 0 : value.value)) {
return /*#__PURE__*/React__default.default.createElement("div", {
className: classes.checkedItem
}, value.label);
}
return value.label;
}
return /*#__PURE__*/React__default.default.createElement(material.Menu, {
sx: {
p: 0,
mt: 0.7
},
anchorEl: anchorEl,
keepMounted: true,
open: !!anchorEl,
onClose: handleClose,
className: classes.dashboardSelectMenu
}, props.isSearch && /*#__PURE__*/React__default.default.createElement(SearchMenuItem, {
className: classes.searchBarContainer,
sx: {
px: 1,
mt: 0
},
disableTouchRipple: true
}, /*#__PURE__*/React__default.default.createElement("div", {
className: classes.search
}, /*#__PURE__*/React__default.default.createElement(SearchBar, {
onClear: function onClear() {
return setSearchText("");
},
placeholder: "Search by keyword..",
isValid: true,
value: searchText,
onChange: function onChange(e) {
return setSearchText(e.target.value.trim());
}
}))), /*#__PURE__*/React__default.default.createElement(ScrollBox, {
sx: {
maxHeight: "200px"
}
}, displayOptions.length > 0 ? displayOptions.map(function (item, index) {
return /*#__PURE__*/React__default.default.createElement("div", {
key: index
}, /*#__PURE__*/React__default.default.createElement(StyledMenuItem, {
className: "list-single-item",
sx: {
background: (selection === null || selection === void 0 ? void 0 : selection.value) === item.value && "orange",
color: (selection === null || selection === void 0 ? void 0 : selection.value) === item.value && "white"
},
onClick: function onClick() {
return handleSelect(item);
}
}, renderOption(item)));
}) : /*#__PURE__*/React__default.default.createElement("div", {
className: "no-options-text",
style: {
textAlign: "center",
my: 1
}
}, /*#__PURE__*/React__default.default.createElement(material.Typography, {
variant: "hl_paragraphBold"
}, "No Options"))));
}
function renderMultiSelectMenu() {
var displayOptions = selectOptions.map(function (item) {
if (item.label.toLowerCase().includes(searchText.toLowerCase())) {
return item;
}
return undefined;
}).filter(function (item) {
return item !== undefined;
});
function renderOption(value) {
if ((selection === null || selection === void 0 ? void 0 : selection.value) === (value === null || value === void 0 ? void 0 : value.value)) {
return /*#__PURE__*/React__default.default.createElement("div", {
className: classes.checkedItem
}, value.label);
}
return value.label;
}
return /*#__PURE__*/React__default.default.createElement(material.Menu, {
sx: {
p: 0,
mt: 0.7
},
anchorEl: anchorEl,
keepMounted: true,
open: !!anchorEl,
onClose: handleClose,
className: classes.dashboardSelectMenu
// anchorReference="anchorOrigin"
// anchorPosition={{ top: 0, left: 0 }}
// anchorOrigin={{
// vertical: "bottom",
// horizontal: "center",
// }}
// transformOrigin={{
// vertical: "top",
// horizontal: "center",
// }}
}, /*#__PURE__*/React__default.default.createElement(SearchMenuItem, {
className: classes.searchBarContainer,
sx: {
px: 1,
mt: 0
},
disableTouchRipple: true
}, /*#__PURE__*/React__default.default.createElement("div", {
className: classes.search
}, /*#__PURE__*/React__default.default.createElement(SearchBar, {
onClear: function onClear() {
return setSearchText("");
},
placeholder: "Search by keyword..",
isValid: true,
value: searchText,
onChange: function onChange(e) {
return setSearchText(e.target.value.trim());
}
}))), /*#__PURE__*/React__default.default.createElement(ScrollBox, {
sx: {
maxHeight: "200px"
}
}, displayOptions.length > 0 ? displayOptions.map(function (item, index) {
return /*#__PURE__*/React__default.default.createElement("div", {
key: index
}, !containsObject(item, multiSelection) && /*#__PURE__*/React__default.default.createElement(StyledMenuItem, {
onClick: function onClick() {
return handleMultiSelect(item);
}
}, props.withCheckBox && /*#__PURE__*/React__default.default.createElement(material.Checkbox, {
sx: {
padding: 0
},
checked: multiSelection.indexOf(item) > -1
}), renderOption(item)));
}) : /*#__PURE__*/React__default.default.createElement(material.Box, null, /*#__PURE__*/React__default.default.createElement(material.Typography, {
variant: "paragraph"
}, "No Options"))));
}
}
SearchBoxSelect.propTypes = {
selectionList: PropTypes__default.default.array.isRequired,
placeholder: PropTypes__default.default.string,
labelKey: PropTypes__default.default.array,
valueKeys: PropTypes__default.default.string,
value: PropTypes__default.default.oneOfType([PropTypes__default.default.array, PropTypes__default.default.object]),
onChange: PropTypes__default.default.func,
autoFormat: PropTypes__default.default.bool,
name: PropTypes__default.default.string,
isRequired: PropTypes__default.default.bool,
label: PropTypes__default.default.string,
isSearch: PropTypes__default.default.bool,
isMultiSelect: PropTypes__default.default.bool,
withCheckBox: PropTypes__default.default.bool,
withChips: PropTypes__default.default.bool,
isDisabled: PropTypes__default.default.bool,
chipDeleteIcon: PropTypes__default.default.string
};
var returnLibrary = function returnLibrary() {
return {
SelectInput: SearchBoxSelect
};
};
var index = returnLibrary();
module.exports = index;