import React, { SelectHTMLAttributes, OptionHTMLAttributes, Ref, useContext, useRef, ChangeEvent, FC, ReactNode, } from 'react'; import classnames from 'classnames'; import { FormElement, FormElementProps } from './FormElement'; import { FieldSetColumnContext } from './FieldSet'; import { useEventCallback } from './hooks'; import { createFC } from './common'; /** * */ export type SelectProps = { label?: string; required?: boolean; cols?: number; error?: FormElementProps['error']; tooltip?: ReactNode; tooltipIcon?: string; elementRef?: Ref; selectRef?: Ref; onValueChange?: (value: string, prevValue?: string) => void; } & SelectHTMLAttributes; /** * */ export const Select = createFC( (props) => { const { id, className, label, required, error, cols, tooltip, tooltipIcon, elementRef, selectRef, children, onChange: onChange_, onValueChange, ...rprops } = props; const { isFieldSetColumn } = useContext(FieldSetColumnContext); const prevValueRef = useRef(); const onChange = useEventCallback((e: ChangeEvent) => { onChange_?.(e); onValueChange?.(e.target.value, prevValueRef.current); prevValueRef.current = e.target.value; }); const selectClassNames = classnames(className, 'slds-select'); const selectElem = ( ); const selectElemWithContainer = rprops.multiple ? ( selectElem ) : (
{selectElem}
); if (isFieldSetColumn || label || required || error || cols) { const formElemProps = { controlId: id, label, required, error, cols, tooltip, tooltipIcon, elementRef, }; return ( {selectElemWithContainer} ); } return selectElemWithContainer; }, { isFormElement: true } ); /** * */ export type OptionProps = OptionHTMLAttributes; /** * */ export const Option: FC = (props) => { const { label, children, ...rprops } = props; return ; };