@timmons-group/config-form
Version:
React Components and helpers to build a form via configuration with react-hook-form and MUI
68 lines (67 loc) • 2.1 kB
TypeScript
/**
* This hook is used to convert a layout into a different structure for use by ConfigForm.
* We are building a new internal structure
*/
import { FIELD_TYPES } from "../constants";
import { Conditional } from "../models/formFields.model";
import { LegacyParsedSection } from "../models/formLegacy.model";
import { type AnySchema } from "yup";
export type FieldTypes = keyof typeof FIELD_TYPES;
export type ConfigFormFieldTypes = Lowercase<FieldTypes>;
export interface ConfigFormField {
id: string;
type: ConfigFormFieldTypes;
render: ConfigFormFieldRender;
validationOptions: ConfigFormValidationOptions;
conditions: Conditional[];
yupValidation?: AnySchema;
watchers?: Map<string, boolean>;
}
export interface RegexpValidation {
pattern: RegExp | string;
flags?: string;
errorMessage?: string;
}
export type ConfigFormFieldRender = BaseFieldRender | DateFieldRender | SelectFieldRender | TextFieldRender;
export interface ConfigFormValidationOptions {
required?: boolean;
minLength?: number;
maxLength?: number;
minValue?: number;
maxValue?: number;
regexpValidation?: RegexpValidation;
requiredErrorText?: string;
minLengthErrorText?: string;
maxLengthErrorText?: string;
[key: string]: any;
}
export interface BaseFieldRender {
required?: boolean;
disabled?: boolean;
hidden?: boolean;
readOnly?: boolean;
placeholder?: string;
helperText?: string;
[key: string]: any;
}
export interface DateFieldRender extends BaseFieldRender {
disableFuture?: boolean;
disableFutureErrorText?: string;
}
export interface SelectFieldRender extends BaseFieldRender {
multiple?: boolean;
checkbox?: boolean;
radio?: boolean;
choices?: Array<Record<string, any>>;
url?: string;
}
export interface ConfigFormLayout {
sections?: LegacyParsedSection[];
fields: Map<string, ConfigFormField>;
}
export interface TextFieldRender extends BaseFieldRender {
emptyMessage?: string;
iconHelperText?: string;
altHelperText?: string;
linkFormat?: string;
}