UNPKG

design-react-kit

Version:

Componenti React per Bootstrap 5

1 lines 9.81 kB
{"version":3,"sources":["../../src/Input/utils.tsx","../../src/utils.tsx"],"sourcesContent":["import classNames from 'classnames';\nimport { useCallback, useState } from 'react';\nimport type { CSSModule } from 'reactstrap/types/lib/utils';\nimport { mapToCssModules } from '../utils';\nimport type { InputProps } from './Input';\n\ntype ValidationProps = Pick<InputProps, 'valid'>;\ntype TypeProps = Pick<InputProps, 'plaintext' | 'type'> & {\n staticInput?: boolean;\n};\ntype FormControlProps = Pick<InputProps, 'normalized'> & TypeProps;\n\nfunction getFormControlClassInternal({ plaintext, staticInput, type = 'text', normalized }: FormControlProps) {\n const formControlClass = 'form-control';\n if (plaintext || staticInput || normalized) {\n return `${formControlClass}-plaintext`;\n }\n if (type === 'file') {\n return `${formControlClass}-file`;\n }\n if (['radio', 'checkbox'].indexOf(type) > -1) {\n return null;\n }\n return formControlClass;\n}\n\nexport function getFormControlClass(props: FormControlProps, cssModule?: CSSModule) {\n return mapToCssModules(getFormControlClassInternal(props), cssModule);\n}\n\nexport function getValidationTextControlClass({ valid }: ValidationProps, cssModule?: CSSModule) {\n return mapToCssModules(\n classNames({\n 'form-text': true,\n 'form-feedback just-validate-error-label': valid == false\n }),\n cssModule\n );\n}\n\nexport function getTag({ tag, plaintext, staticInput, type = 'text' }: Pick<InputProps, 'tag'> & TypeProps) {\n if (tag) {\n return tag;\n }\n if (['radio', 'checkbox'].indexOf(type) > -1) {\n return 'input';\n }\n if (plaintext || staticInput) {\n return 'p';\n }\n return 'input';\n}\n\ntype InputClassesParams = ValidationProps &\n Pick<InputProps, 'bsSize' | 'placeholder' | 'value' | 'label' | 'validationText' | 'normalized'> & {\n isFocused: boolean;\n inputPassword?: boolean;\n formControlClass?: string;\n validationTextControlClass?: string;\n originalWrapperClass: InputProps['wrapperClassName'];\n };\n\nexport function getClasses(\n className: string | undefined,\n type: string,\n {\n isFocused,\n valid,\n bsSize,\n placeholder,\n value,\n label,\n validationText,\n normalized,\n inputPassword,\n formControlClass,\n validationTextControlClass,\n originalWrapperClass\n }: InputClassesParams,\n cssModule?: CSSModule\n) {\n const hasPlainCondition = placeholder || label || validationText;\n const baseCondition = hasPlainCondition && !normalized && !inputPassword;\n const passwordOnlyCondition = inputPassword && !hasPlainCondition && !normalized;\n const normalizedOnlyCondition = normalized && !hasPlainCondition && !inputPassword;\n\n const classes = mapToCssModules(\n classNames(\n className,\n {\n 'is-invalid': valid == false,\n 'just-validate-success-field': valid,\n [`form-control-${bsSize}`]: bsSize\n },\n formControlClass\n ),\n cssModule\n );\n const wrapperClass = mapToCssModules(classNames(originalWrapperClass, 'form-group'), cssModule);\n const validationTextClass = mapToCssModules(\n classNames(\n {\n 'valid-feedback': valid,\n 'invalid-feedback form-feedback just-validate-error-label': valid == false\n },\n validationTextControlClass\n ),\n cssModule\n );\n\n const inputClasses = mapToCssModules(\n classNames(\n classes,\n !baseCondition && {\n // we can model here only if stylings\n 'form-control-plaintext': normalizedOnlyCondition,\n 'form-control': passwordOnlyCondition,\n 'input-password': passwordOnlyCondition\n }\n ),\n cssModule\n );\n\n const activeClass = mapToCssModules(\n classNames({\n active: isFocused || placeholder || value || ['date', 'time'].includes(type)\n }),\n cssModule\n );\n\n const extraLabelClass = mapToCssModules(\n classNames({\n 'input-number-label': ['number', 'currency', 'adaptive', 'percentage'].includes(type)\n })\n );\n\n return {\n wrapperClass,\n inputClasses,\n activeClass,\n extraLabelClass,\n validationTextClass\n };\n}\n\nexport function useFocus<T extends HTMLInputElement | HTMLTextAreaElement>({\n onFocus,\n onBlur\n}: {\n onFocus: React.FocusEventHandler<T> | undefined;\n onBlur: React.FocusEventHandler<T> | undefined;\n}) {\n const [isFocused, setFocus] = useState(false);\n\n const toggleFocusLabel = useCallback(\n (e: React.FocusEvent<T>) => {\n setFocus(true);\n onFocus?.(e);\n },\n [onFocus]\n );\n\n const toggleBlurLabel = useCallback(\n (e: React.FocusEvent<T>) => {\n if (e.target.value === '') {\n setFocus(!isFocused);\n }\n onBlur?.(e);\n },\n [isFocused, onBlur]\n );\n\n return { toggleFocusLabel, toggleBlurLabel, isFocused };\n}\n","export const noop = () => {};\n\nexport const logError = (message: string) => {\n if (typeof console !== 'undefined') {\n if (console.error) {\n console.error(message);\n } else {\n console.log(message);\n }\n }\n};\n\n// @internal Used for testing purposes only\nexport const flushMessageCache = () => {\n for (const key in messages) {\n delete messages[key];\n }\n};\n\nconst messages: Record<string, 1> = {};\nexport const notifyDeprecation = (message: string, options: { once: boolean } = { once: true }) => {\n if (!options.once) {\n logError(message);\n } else {\n if (!messages[message]) {\n logError(message);\n messages[message] = 1;\n }\n }\n};\n\nexport function mapToCssModules(className: string | null, cssModules?: Record<string, string>) {\n const finalClassNames = className == null ? '' : className;\n if (!cssModules) {\n return finalClassNames;\n }\n return finalClassNames\n .split(' ')\n .map((klass) => cssModules[klass] ?? klass)\n .join(' ');\n}\n\ntype UnknownObject = Record<string, unknown>;\n\nexport function pick<T extends UnknownObject>(obj: T, keys: keyof T | Array<keyof T>): Partial<T> {\n const keysArray = Array.isArray(keys) ? keys : [keys];\n const newObj: Partial<T> = {};\n for (const key of keysArray) {\n if (key in obj) {\n newObj[key] = obj[key];\n }\n }\n return newObj;\n}\n\nexport function omit<T extends UnknownObject>(obj: T, keys: keyof T | Array<keyof T>): Partial<T> {\n const keysLookup = new Set(Array.isArray(keys) ? keys : [keys]);\n\n const newObj: Partial<T> = {};\n for (const key in obj) {\n if (!keysLookup.has(key)) {\n newObj[key] = obj[key];\n }\n }\n return newObj;\n}\n"],"mappings":"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","names":["utils_exports","__export","getClasses","getFormControlClass","getTag","getValidationTextControlClass","useFocus","__toCommonJS","import_classnames","import_react","mapToCssModules","className","cssModules","finalClassNames","klass","getFormControlClassInternal","plaintext","staticInput","type","normalized","formControlClass","getFormControlClass","props","cssModule","mapToCssModules","getValidationTextControlClass","valid","classNames","getTag","tag","getClasses","className","isFocused","bsSize","placeholder","value","label","validationText","inputPassword","validationTextControlClass","originalWrapperClass","hasPlainCondition","baseCondition","passwordOnlyCondition","normalizedOnlyCondition","classes","wrapperClass","validationTextClass","inputClasses","activeClass","extraLabelClass","useFocus","onFocus","onBlur","setFocus","toggleFocusLabel","e","toggleBlurLabel"]}