UNPKG

@ladg/rhfmui

Version:

The integration of MUI components with React hook form.

401 lines (400 loc) 26.9 kB
import * as __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__ from "react/jsx-runtime"; import * as __WEBPACK_EXTERNAL_MODULE_react__ from "react"; import * as __WEBPACK_EXTERNAL_MODULE__mui_icons_material_CheckBox_709569e5__ from "@mui/icons-material/CheckBox"; import * as __WEBPACK_EXTERNAL_MODULE__mui_icons_material_CheckBoxOutlineBlank_1de5ee8f__ from "@mui/icons-material/CheckBoxOutlineBlank"; import * as __WEBPACK_EXTERNAL_MODULE__mui_material_39280ebf__ from "@mui/material"; import * as __WEBPACK_EXTERNAL_MODULE__mui_material_Autocomplete_7a50a8f5__ from "@mui/material/Autocomplete"; import * as __WEBPACK_EXTERNAL_MODULE__mui_material_Checkbox_a38238a1__ from "@mui/material/Checkbox"; import * as __WEBPACK_EXTERNAL_MODULE__mui_material_Chip_305fde45__ from "@mui/material/Chip"; import * as __WEBPACK_EXTERNAL_MODULE__mui_material_CircularProgress_60f00cb3__ from "@mui/material/CircularProgress"; import * as __WEBPACK_EXTERNAL_MODULE__mui_material_FormHelperText_3b87fa55__ from "@mui/material/FormHelperText"; import * as __WEBPACK_EXTERNAL_MODULE__mui_material_Grid2_6b284161__ from "@mui/material/Grid2"; import * as __WEBPACK_EXTERNAL_MODULE__mui_material_Popper_24cb866b__ from "@mui/material/Popper"; import * as __WEBPACK_EXTERNAL_MODULE__mui_material_TextField_4cf233bd__ from "@mui/material/TextField"; import * as __WEBPACK_EXTERNAL_MODULE__mui_material_Tooltip_69cc2f11__ from "@mui/material/Tooltip"; import * as __WEBPACK_EXTERNAL_MODULE__mui_material_Typography_77749481__ from "@mui/material/Typography"; import * as __WEBPACK_EXTERNAL_MODULE_fast_sort_cfaf6b47__ from "fast-sort"; import * as __WEBPACK_EXTERNAL_MODULE_highlight_words_core_9bb680fc__ from "highlight-words-core"; import * as __WEBPACK_EXTERNAL_MODULE_match_sorter_d3c53fe5__ from "match-sorter"; import * as __WEBPACK_EXTERNAL_MODULE_react_hook_form_05a66946__ from "react-hook-form"; const RHFMuiAutoCompleteSingle = (props)=>{ const { rhfinstance, rhf_rules, name = '', options = [], label = '', placeholder = '', disabled = false, fullWidth = false, dropdownHeight = '300', dropdownMaxWidth = '', permanentMessage = '', enableCheckboxForOptions = false, optionTableView, highlightSearchMatch = true, onChangeExtraHandler, autocompleteProps, textFieldProps } = props; const { control } = rhfinstance; const isTableViewEnabled = !!optionTableView?.columnHeader?.length && true; const theme = (0, __WEBPACK_EXTERNAL_MODULE__mui_material_39280ebf__.useTheme)(); const sortedOpionsByLabel = (0, __WEBPACK_EXTERNAL_MODULE_fast_sort_cfaf6b47__.sort)(options).asc((o)=>[ o?.optionLabel, o?.groupByProp ]); const sortedOpionsByGroupByProp = (0, __WEBPACK_EXTERNAL_MODULE_fast_sort_cfaf6b47__.sort)(sortedOpionsByLabel).asc((o)=>o?.groupByProp); const [newOptionList, setnewOptionList] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)([]); (0, __WEBPACK_EXTERNAL_MODULE_react__.useEffect)(()=>{ let optionList = []; optionList = isTableViewEnabled ? [ { id: 'tableView', optionLabel: 'tableHeader', value: '', isDisabled: true }, ...sortedOpionsByGroupByProp ] : sortedOpionsByGroupByProp; setnewOptionList(optionList); }, [ isTableViewEnabled, options ]); const screenWidth = window.innerWidth; const [listBoxWidth, setListBoxWidth] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)('0px'); (0, __WEBPACK_EXTERNAL_MODULE_react__.useEffect)(()=>{ setListBoxWidth(`${screenWidth}px`); }, [ screenWidth ]); const MyListboxComponent = (listboxProps)=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_material_39280ebf__.Paper, { ...listboxProps, style: { width: isTableViewEnabled ? listBoxWidth : '100%', maxHeight: dropdownHeight ? `${dropdownHeight}px` : '300px' } }); const myref = (0, __WEBPACK_EXTERNAL_MODULE_react__.useRef)(null); const actualWidthOfAutocomplete = myref?.current?.offsetWidth; const [popperStyle, setPopperStyle] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)({}); (0, __WEBPACK_EXTERNAL_MODULE_react__.useEffect)(()=>{ dropdownMaxWidth ? setPopperStyle({ width: isTableViewEnabled ? '100%' : `${actualWidthOfAutocomplete}px`, maxWidth: `${dropdownMaxWidth}px` }) : setPopperStyle({ width: isTableViewEnabled ? '100%' : `${actualWidthOfAutocomplete}px` }); }, [ dropdownMaxWidth, isTableViewEnabled, actualWidthOfAutocomplete ]); const MyPopperComponent = (popperProps)=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_material_Popper_24cb866b__["default"], { ...popperProps, style: popperStyle }); return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE_react_hook_form_05a66946__.Controller, { control: control, name: name, rules: rhf_rules, render: ({ field: { value, onChange, ref }, fieldState: { error } })=>/*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_material_Autocomplete_7a50a8f5__["default"], { ...autocompleteProps, disabled: autocompleteProps?.disabled || disabled, id: autocompleteProps?.id || `${name}_autocomplete_single`, disablePortal: false, options: newOptionList || {}, value: value || {}, defaultValue: {}, noOptionsText: autocompleteProps?.noOptionsText || 'No options found.', getOptionLabel: (option)=>option?.optionLabel || '', onChange: (e, values, reason, details)=>{ onChange(values); if (!!onChangeExtraHandler) onChangeExtraHandler(e, values, reason, details); }, isOptionEqualToValue: (option, value)=>option?.value === value?.value, renderInput: (params)=>{ const startAdornmentByUser = textFieldProps?.slotProps?.input?.startAdornment; const endAdornmentByUser = textFieldProps?.slotProps?.input?.endAdornment; return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)(__WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.Fragment, { children: [ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_material_TextField_4cf233bd__["default"], { ref: myref, ...params, ...textFieldProps, inputRef: ref, label: label, fullWidth: fullWidth || textFieldProps?.fullWidth, placeholder: placeholder || '', error: !!error, sx: { width: textFieldProps?.fullWidth || fullWidth ? '100%' : '210px', ...textFieldProps?.sx }, size: textFieldProps?.size || 'small', slotProps: { ...textFieldProps?.slotProps, inputLabel: { sx: { '.MuiInputLabel-asterisk': { color: 'red' }, ...textFieldProps?.slotProps?.inputLabel?.sx }, shrink: !!placeholder || void 0, ...textFieldProps?.slotProps?.inputLabel }, input: { ...params.InputProps, ...textFieldProps?.slotProps?.input, endAdornment: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)(__WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.Fragment, { children: [ endAdornmentByUser || '', params.InputProps?.endAdornment ] }), startAdornment: params.InputProps?.startAdornment || startAdornmentByUser ? /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)(__WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.Fragment, { children: [ startAdornmentByUser, params.InputProps?.startAdornment ] }) : '' } } }), !!autocompleteProps?.loading && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)(__WEBPACK_EXTERNAL_MODULE__mui_material_Grid2_6b284161__["default"], { container: true, direction: "row", spacing: 1, sx: { justifyContent: 'flex-start', alignItems: 'center' }, children: [ /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_material_CircularProgress_60f00cb3__["default"], { size: 15, thickness: 6 }), /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_material_Typography_77749481__["default"], { children: "Loading, wait...!" }) ] }), !!permanentMessage && 'function' == typeof permanentMessage && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_material_FormHelperText_3b87fa55__["default"], { error: true, children: permanentMessage() }), !!permanentMessage && 'string' == typeof permanentMessage && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_material_FormHelperText_3b87fa55__["default"], { error: true, children: permanentMessage }), !!error && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_material_FormHelperText_3b87fa55__["default"], { error: true, children: error?.message || '' }) ] }); }, groupBy: (option)=>option?.groupByProp, filterOptions: (options, state)=>{ if (!!isTableViewEnabled) options?.shift(); const filteredResult = (0, __WEBPACK_EXTERNAL_MODULE_match_sorter_d3c53fe5__.matchSorter)(options, state.inputValue || '', { keys: [ { threshold: __WEBPACK_EXTERNAL_MODULE_match_sorter_d3c53fe5__.matchSorter.rankings.CONTAINS, key: 'optionLabel' } ] }); const returnableResultAfterFilter = [ { id: 'tableView', optionLabel: 'tableHeader', value: '', isDisabled: true }, ...filteredResult ]; return isTableViewEnabled ? returnableResultAfterFilter : filteredResult; }, renderOption: (props, option, state)=>{ const { selected, inputValue, index: stateOptionIndex } = state; const { key, ...optionProps } = props; let optionToDisplay = ''; if (highlightSearchMatch) { const chunks = (0, __WEBPACK_EXTERNAL_MODULE_highlight_words_core_9bb680fc__.findAll)({ searchWords: [ inputValue ], textToHighlight: option?.optionLabel }); const highlightedText = chunks.map((chunk, index)=>{ const { end, highlight, start } = chunk; const text = option?.optionLabel?.substr(start, end - start); return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", { style: { backgroundColor: highlight ? '#FFCB7F' : '', borderRadius: highlight ? '5px' : '' }, children: text }, index); }); optionToDisplay = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", { children: highlightedText }); } else optionToDisplay = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", { children: option?.optionLabel }); if (!isTableViewEnabled) return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("li", { ...optionProps, style: { padding: '5px' }, children: [ !!enableCheckboxForOptions && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_material_Checkbox_a38238a1__["default"], { icon: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_icons_material_CheckBoxOutlineBlank_1de5ee8f__["default"], {}), checkedIcon: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_icons_material_CheckBox_709569e5__["default"], {}), checked: selected, size: "small", sx: { margin: '0px', padding: '3px' } }, option?.id), option?.customLabel && 'function' == typeof option?.customLabel ? option?.customLabel() : optionToDisplay ] }, option.id); { const trBackgroundColor = stateOptionIndex % 2 === 1 ? (0, __WEBPACK_EXTERNAL_MODULE__mui_material_39280ebf__.lighten)(theme.palette.primary.main, 0.9) : ''; return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("li", { ...optionProps, style: { position: option?.id === 'tableView' ? 'sticky' : void 0, top: option?.id === 'tableView' ? 0 : void 0, zIndex: option?.id === 'tableView' ? 10 : void 0, backgroundColor: option?.id === 'tableView' ? `${theme?.palette?.primary?.main}` : void 0, opacity: option?.id === 'tableView' ? 10 : void 0, padding: '5px' }, children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("table", { style: { tableLayout: 'fixed', width: '100%', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'wrap' }, children: [ option?.id === 'tableView' && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("thead", { children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("tr", { children: [ !!enableCheckboxForOptions && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("th", { style: { width: '40px' } }, "check"), optionTableView?.columnHeader?.map((item, index)=>/*#__PURE__*/ __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx("th", { style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'wrap', color: 'white', paddingLeft: '10px' }, children: item }, `${item}_${index}`)) ] }) }), option?.id !== 'tableView' && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("tbody", { children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("tr", { style: { backgroundColor: trBackgroundColor }, children: [ !!enableCheckboxForOptions && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("td", { style: { textAlign: 'center', justifyContent: 'center', width: '40px' }, children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_material_Checkbox_a38238a1__["default"], { icon: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_icons_material_CheckBoxOutlineBlank_1de5ee8f__["default"], {}), checkedIcon: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_icons_material_CheckBox_709569e5__["default"], {}), checked: selected, size: "small", sx: { margin: '0px', padding: '3px' } }, option?.id) }), /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("td", { style: { wordBreak: 'break-word', paddingLeft: '10px' }, children: optionToDisplay }), optionTableView?.rowValues?.map((item, index)=>{ const isFunc = 'function' == typeof item; const isString = 'string' == typeof item; if (!!isString) return /*#__PURE__*/ __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx("td", { style: { wordBreak: 'break-word', paddingLeft: '10px' }, children: option?.dataObject[`${item}`] }, `${item}_${index}`); if (!!isFunc) return /*#__PURE__*/ __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx("td", { style: { wordBreak: 'break-word', paddingLeft: '10px' }, children: item(option?.dataObject) }, `${item}_${index}`); }) ] }) }) ] }) }, option?.id); } }, getOptionDisabled: (option)=>{ if (!!option?.isDisabled) return true; return false; }, renderTags: (tagValue, getTagProps)=>tagValue.map((option, index)=>{ const { key, ...tagProps } = getTagProps({ index }); return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react__.createElement)(__WEBPACK_EXTERNAL_MODULE__mui_material_Chip_305fde45__["default"], { ...tagProps, key: option?.id, label: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__mui_material_Tooltip_69cc2f11__["default"], { title: option?.optionLabel, arrow: true, children: /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)("span", { children: option?.optionLabel }) }), disabled: !!option?.isFixed, sx: { borderRadius: '5px' } }); }), slotProps: { ...autocompleteProps?.slotProps, listbox: { component: MyListboxComponent, sx: { paddingTop: '0px', ...autocompleteProps?.slotProps?.listbox?.sx }, ...autocompleteProps?.slotProps?.listbox }, popper: { component: MyPopperComponent, sx: { '& .MuiAutocomplete-groupLabel': { fontSize: '15px', fontWeight: 'bold', color: 'white', backgroundColor: `${theme?.palette?.primary?.main}`, padding: '0px' }, ...autocompleteProps?.slotProps?.popper?.sx }, ...autocompleteProps?.slotProps?.popper } } }) }); }; export { RHFMuiAutoCompleteSingle };