UNPKG

@geneui/components

Version:

The Gene UI components library designed for BI tools

142 lines (135 loc) 4.5 kB
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 };