import React, {ComponentPropsWithoutRef, ReactElement, ReactNode} from 'react'; import {Adornment} from './adornment'; import {InputFieldStyle} from './get-input-field-class-names'; import {BaseFieldProps} from './base-field-props'; import {removeEmptyValuesFromObject} from '@common/utils/objects/remove-empty-values-from-object'; export interface FieldProps extends BaseFieldProps { children: ReactNode; wrapperProps?: ComponentPropsWithoutRef<'div'>; labelProps?: ComponentPropsWithoutRef<'label' | 'span'>; descriptionProps?: ComponentPropsWithoutRef<'div'>; errorMessageProps?: ComponentPropsWithoutRef<'div'>; fieldClassNames: InputFieldStyle; } export const Field = React.forwardRef( (props, ref) => { const { children, // Not every component that uses supports help text. description, errorMessage, descriptionProps = {}, errorMessageProps = {}, startAdornment, endAdornment, adornmentPosition, startAppend, endAppend, fieldClassNames, disabled, wrapperProps, } = props; return (
); } ); function Label({ labelElementType, fieldClassNames, labelProps, label, labelSuffix, required, }: Omit) { if (!label) { return null; } const ElementType = labelElementType || 'label'; const labelNode = ( {label} {required && *} ); if (labelSuffix) { return (
{labelNode}
{labelSuffix}
); } return labelNode; } interface AppendProps { children: ReactElement; style: InputFieldStyle['append']; disabled?: boolean; } function Append({children, style, disabled}: AppendProps) { return React.cloneElement(children, { ...children.props, disabled: children.props.disabled || disabled, // make sure append styles are not overwritten with empty values ...removeEmptyValuesFromObject(style), }); }