@geneui/components
Version:
The Gene UI components library designed for BI tools
142 lines (135 loc) • 4.5 kB
JavaScript
import { _ as _extends } from '../_rollupPluginBabelHelpers-e8fb2e5c.js';
import React__default, { forwardRef, useState, useCallback, useEffect } from 'react';
import PropTypes from 'prop-types';
import useMount from '../hooks/useMount.js';
import '../configs-00612ce0.js';
import { n as noop } from '../index-a0e4e333.js';
import { D as Dropdown } from '../index-9d8d0112.js';
import '../dateValidation-67caec66.js';
import '../_commonjsHelpers-24198af3.js';
import 'react-dom';
import '../objectWithoutPropertiesLoose-d8a4a68c.js';
import '../react-lifecycles-compat.es-6e1f3768.js';
import '../clsx.m-2bb6df4b.js';
import '../index-031ff73c.js';
import '../hooks/useClick.js';
import '../hooks/useKeyDown.js';
import '../hooks/useDeviceType.js';
import '../hooks/useWindowSize.js';
import '../hooks/useDebounce.js';
import '../hooks/useClickOutside.js';
import '../hooks/useUpdatableRef.js';
import '../hooks/useForceUpdate.js';
import '../useEllipsisDetection-4d997d5d.js';
import '../BusyLoader/index.js';
import '../Icon/index.js';
import '../style-inject.es-746bb8ed.js';
import '../Empty/index.js';
import '../tslib.es6-f211516f.js';
import '../index-08898b29.js';
import '../index-122432cd.js';
import '../Scrollbar/index.js';
import '../GeneUIProvider/index.js';
import '../debounce-4419bc2f.js';
import '../index-6d7e99cd.js';
import '../ExtendedInput/index.js';
import '../SuggestionList/index.js';
import '../config-1053d64d.js';
import '../callAfterDelay-7272faca.js';
import '../Checkbox/index.js';
import '../checkboxRadioSwitcher-5b69d7bd.js';
import '../guid-8ddf77b3.js';
import '../index-0cbb1102.js';
import '../Tag/index.js';
function checkValidation(required, isValid, value) {
if (isValid === false) return {
key: 'customValidation',
isValid: false
};
if ((value === 'undefined' || value === null) && required) return {
key: 'required',
isValid: false
};
return {
key: null,
isValid: true
};
}
const DropdownField = /*#__PURE__*/forwardRef((props, ref) => {
const {
onChange,
value,
isValid,
required,
isFieldValid,
forceAllowValidation,
valueKey,
...restProps
} = props;
const isControlled = 'value' in props && typeof value !== 'undefined';
const [val, setVal] = useState(value || null);
const [validationState, setValidationState] = useState(true);
const [allowValidation, setAllowValidation] = useState(false);
const validate = useCallback(() => checkValidation(required, isValid, val).isValid, [val, required, isValid]);
const handleChange = useCallback(param => {
const {
[valueKey]: value = null
} = param || {};
const validation = checkValidation(required, isValid, value);
setValidationState(validation.isValid);
setVal(value);
onChange(param, validation.isValid, validation.key);
}, [onChange, required, isValid, valueKey]);
// we use this because need to show field validation after onClose
const onBlur = useCallback(() => setAllowValidation(true), []);
const onClear = useCallback(() => {
const validState = checkValidation(required, isValid, null).isValid;
setValidationState(validState);
}, [required, isValid]);
useEffect(() => {
isControlled && setValidationState(validate());
}, [isControlled, validate]);
useEffect(() => {
setVal(value);
}, [value]);
// need this for handling user's `isValid` prop
useEffect(() => {
setValidationState(isValid);
}, [isValid]);
// call function when validation state changes
useEffect(() => {
isFieldValid(validationState);
}, [validationState]);
// set Allow validation true if submit button clicked
useEffect(() => {
forceAllowValidation && setAllowValidation(true);
}, [forceAllowValidation]);
useMount(() => setValidationState(validate()));
return /*#__PURE__*/React__default.createElement(Dropdown, _extends({
required: required,
ref: ref,
value: val,
isValid: !allowValidation || validationState,
onChange: handleChange,
onBlur: onBlur,
onClear: onClear,
valueKey: valueKey
}, restProps));
});
DropdownField.propTypes = {
value: PropTypes.any,
onChange: PropTypes.func,
required: PropTypes.bool,
readOnly: PropTypes.bool,
isValid: PropTypes.bool,
forceAllowValidation: PropTypes.bool,
isFieldValid: PropTypes.func
};
DropdownField.defaultProps = {
required: false,
readOnly: false,
valueKey: 'value',
isFieldValid: noop,
onChange: noop
};
export { DropdownField as default };