import { FormDisplayerProps, FormFieldValueDisplayerProps, useForm } from 'onekijs-framework'; import React from 'react'; import Select from '.'; import { titlelize } from '../../utils/misc'; import FieldDisplayer from '../field/FieldDisplayer'; import FieldLayout from '../field/FieldLayout'; import useFieldLayout from '../field/hooks/useFieldLayout'; import { FormSelectProps, SelectItem, SelectProps } from './typings'; const FormSelectValueDisplayer: React.FC = ({ value }) => { if (Array.isArray(value)) { return ( <> {value.map((v, index) => (
{v ?? ''}
))} ); } return {value ?? ''}; }; const FormSelect = = SelectItem>(props: FormSelectProps) => { const service = props.controller ? props.controller.asService() : undefined; const defaultValue = props.defaultValue === undefined ? (props.multiple ? [] : null) : props.defaultValue; const [fieldLayoutProps, fieldComponentProps] = useFieldLayout>( Object.assign({}, props, { defaultValue, Displayer: props.Displayer ?? ((displayerProps: FormDisplayerProps) => { const form = useForm(); let value = form.getValue(displayerProps.name) ?? ''; const adapter = props.adapter; if (value === undefined || value === null) { value = ''; } else if (service) { if (Array.isArray(value)) { value = value.map((v) => { const adaptee = service.adapt(v); return adaptee.text ?? `${value}`; }); } else { const adaptee = service.adapt(value); value = adaptee.text ?? `${value}`; } } else if (adapter) { if (Array.isArray(value)) { value = value.map((v) => { const adaptee = adapter(v); return adaptee.text ?? `${value}`; }); } else { const adaptee = adapter(value); value = adaptee.text ?? `${value}`; } } const ValueDisplayer = props.ValueDisplayer ?? FormSelectValueDisplayer; return ( } format={displayerProps.format} /> ); }), }), ); const Component = props.FieldComponent || Select; return ( ); }; FormSelect.displayName = 'FormSelect'; export default React.memo(FormSelect) as typeof FormSelect;