1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-01-11 00:52:29 +01:00

71 lines
2.7 KiB
TypeScript
Raw Normal View History

2022-04-06 12:24:04 +02:00
import React from 'react';
2022-04-04 18:19:59 +02:00
import Select from 'react-select';
import { Controller, Path } from 'react-hook-form';
import { FieldValues } from 'react-hook-form/dist/types/fields';
import { FieldPath } from 'react-hook-form/dist/types/path';
import { FieldPathValue, UnpackNestedValue } from 'react-hook-form/dist/types';
import { FormControlledComponent } from '../../models/form-component';
2022-04-04 18:19:59 +02:00
2022-04-06 12:24:04 +02:00
interface FormSelectProps<TFieldValues, TContext extends object, TOptionValue> extends FormControlledComponent<TFieldValues, TContext> {
id: string,
label?: string,
options: Array<selectOption<TOptionValue>>,
valueDefault?: TOptionValue,
2022-04-06 12:24:04 +02:00
onChange?: (value: TOptionValue) => void,
className?: string,
placeholder?: string,
disabled?: boolean,
2022-04-04 18:19:59 +02:00
}
/**
* Option format, expected by react-select
* @see https://github.com/JedWatson/react-select
*/
type selectOption<TOptionValue> = { value: TOptionValue, label: string };
/**
* This component is a wrapper for react-select to use with react-hook-form
*/
2022-04-06 12:24:04 +02:00
export const FormSelect = <TFieldValues extends FieldValues, TContext extends object, TOptionValue>({ id, label, className, control, placeholder, options, valueDefault, error, rules, disabled, onChange }: FormSelectProps<TFieldValues, TContext, TOptionValue>) => {
const classNames = `
2022-04-11 13:19:07 +02:00
form-select form-item ${className || ''}
${error && error[id] ? 'is-incorrect' : ''}
${rules && rules.required ? 'is-required' : ''}
${disabled ? 'is-disabled' : ''}`;
2022-04-06 12:24:04 +02:00
/**
* The following callback will trigger the onChange callback, if it was passed to this component,
* when the selected option changes.
*/
const onChangeCb = (newValue: TOptionValue): void => {
if (typeof onChange === 'function') {
onChange(newValue);
}
};
2022-04-04 18:19:59 +02:00
return (
<label className={classNames}>
2022-04-05 19:09:59 +02:00
{label && <div className="form-item-header">
<p>{label}</p>
</div>}
2022-04-05 19:09:59 +02:00
<div className="form-item-field">
<Controller name={id as FieldPath<TFieldValues>}
control={control}
defaultValue={valueDefault as UnpackNestedValue<FieldPathValue<TFieldValues, Path<TFieldValues>>>}
render={({ field: { onChange, value, ref } }) =>
2022-04-06 12:24:04 +02:00
<Select ref={ref}
classNamePrefix="rs"
className="rs"
value={options.find(c => c.value === value)}
onChange={val => {
onChangeCb(val.value);
onChange(val.value);
}}
placeholder={placeholder}
options={options} />
} />
</div>
</label>
2022-04-04 18:19:59 +02:00
);
};