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 ;
};