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

57 lines
2.2 KiB
TypeScript
Raw Normal View History

import React, { InputHTMLAttributes, ReactNode } from 'react';
import { FieldPathValue } from 'react-hook-form';
import { FieldValues } from 'react-hook-form/dist/types/fields';
import { FieldPath } from 'react-hook-form/dist/types/path';
import { FormComponent } from '../../models/form-component';
2022-02-03 15:32:02 +01:00
interface FormInputProps<TFieldValues> extends InputHTMLAttributes<HTMLInputElement>, FormComponent<TFieldValues>{
2022-02-03 15:32:02 +01:00
id: string,
label?: string,
tooltip?: ReactNode,
2022-02-03 15:32:02 +01:00
icon?: ReactNode,
addOn?: ReactNode,
addOnClassName?: string,
}
/**
* This component is a template for an input component to use within React Hook Form
*/
export const FormInput = <TFieldValues extends FieldValues>({ id, register, label, tooltip, defaultValue, icon, className, rules, readOnly, disabled, type, addOn, addOnClassName, placeholder, error, step }: FormInputProps<TFieldValues>) => {
2022-02-03 15:32:02 +01:00
// Compose classnames from props
const classNames = `
2022-04-11 13:19:07 +02:00
form-input form-item ${className || ''}
2022-04-06 17:14:23 +02:00
${type === 'hidden' ? 'is-hidden' : ''}
2022-02-03 15:32:02 +01:00
${error && error[id] ? 'is-incorrect' : ''}
${rules && rules.required ? 'is-required' : ''}
${readOnly ? 'is-readOnly' : ''}
${disabled ? 'is-disabled' : ''}`;
return (
<label className={classNames}>
2022-04-05 19:09:59 +02:00
{label && <div className='form-item-header'>
2022-02-03 15:32:02 +01:00
<p>{label}</p>
{tooltip && <div className="item-tooltip">
<span className="trigger"><i className="fa fa-question-circle" /></span>
<div className="content">{tooltip}</div>
</div>}
2022-02-03 15:32:02 +01:00
</div>}
2022-04-05 19:09:59 +02:00
<div className='form-item-field'>
2022-02-03 15:32:02 +01:00
{icon && <span className="icon">{icon}</span>}
<input id={id}
{...register(id as FieldPath<TFieldValues>, {
2022-02-03 15:32:02 +01:00
...rules,
valueAsNumber: type === 'number',
value: defaultValue as FieldPathValue<TFieldValues, FieldPath<TFieldValues>>
2022-02-03 15:32:02 +01:00
})}
type={type}
step={step}
disabled={disabled}
readOnly={readOnly}
placeholder={placeholder} />
{addOn && <span className={`addon ${addOnClassName || ''}`}>{addOn}</span>}
</div>
2022-04-05 19:09:59 +02:00
{(error && error[id]) && <div className="form-item-error">{error[id].message}</div> }
2022-02-03 15:32:02 +01:00
</label>
);
};