UNPKG

@lstz/reusable-form

Version:

A reusable React component for creating simple, flexible forms.

92 lines (81 loc) 4.01 kB
import { InputHTMLAttributes } from 'react'; import { FieldValues, Path } from 'react-hook-form'; /** * Interface ButtonContentData : Définition du contenu du bouton de soumission * - `type` est le type de contenu (text, image) * - `content` est le texte ou l'URL de l'image */ export interface ButtonContentData { type: 'text' | 'image'; content: string; } /** * Interface FooterMessageData : Définition des données d'un message de pied de formulaire * - `type` est le type de message (default, error, success, info) * - `text` est le message * - `linkText` est le texte du lien cliquable * - `linkTo` est l'URL vers laquelle redirige le lien */ export interface FooterMessageData { type: 'default' | 'error' | 'success' | 'info' | 'none'; text?: string; linkText?: string; linkTo?: string; } /** * Interface FieldDesactivation : Définition de la désactivation d'un champ de formulaire * - `field` est le champ à désactiver * - `condition` est l'objet contenant le champ et sa valeur de condition */ export interface FieldDesactivation<T extends FieldValues> { field: Path<T>; condition: { field: string; value: string | number | boolean; }; } /** * Interface FormField : Définition générique d'un champ de formulaire * - `T` représente les valeurs du formulaire (ex: `RegisterCredentials`) * - FieldValues est une interface définie dans la librairie react-hook-form pour typer les valeurs des champs de formulaire (export type FieldValues = Record<string, any>;) * - `label` est le texte du libellé affiché. * - `id` est une clé de `T`, typée avec `Path<T>` * -`Path<T>` est utilisé pour typer l'id d'un champ de formulaire comme une clé de l'interface T (chemin "T.clé" similaire à "keyof T")) * - On étend `InputHTMLAttributes<HTMLInputElement | HTMLSelectElement>` pour inclure toutes les propriétés natives des `<input>`(ex: type, placeholder, etc. pas besoin de les redéfinir ici) ou des `<select>` (ex: options) * * @template T - Type générique représentant les valeurs du formulaire (ex: `RegisterCredentials`) * @property {string} label - Libellé du champ de formulaire * @property {Path<T>} id - Clé de l'objet `T`, utilisée pour identifier l'input dans `react-hook-form` * @property {Object[]} [options] - Options pour un champ de type `select` */ export interface FormField<T extends FieldValues> extends InputHTMLAttributes<HTMLInputElement | HTMLSelectElement> { label: string; id: Path<T>; options?: readonly { readonly value: string; readonly label: string }[]; // `as const` est utilisé dans les constantes pour avoir le bon type (tuple) dans le schema zod et rend les tableaux readonly } /** * Interface FormConfig<T> : Définition de la structure d'un formulaire configurable. * * @template T - Type des données du formulaire (ex: `RegisterCredentials`) * @property {string} title - Titre du formulaire. * @property {FormField<T>[]} fields - Liste des champs du formulaire, chacun défini selon `FormField<T>`. * @property {Object} [options] - Options du formulaire. * @property {FieldDesactivation<T>[]} [options.fieldsDesactivation] - Liste des champs à désactiver selon certaines conditions (permet de désactiver dynamiquement des champs en fonction de conditions basées sur d'autres champs du formulaire.) * @property {Object} submitButton - Contient le contenu du bouton de soumission. * @property {ButtonContentData} submitButton.loading - Texte ou image à afficher pendant le chargement. * @property {ButtonContentData} submitButton.default - Texte ou image à afficher par défaut. * @property {FooterMessageData} [footerMessage] - Message de pied de formulaire option */ export interface FormConfig<T extends FieldValues> { title: string; fields: FormField<T>[]; options?: { fieldsDesactivation?: FieldDesactivation<T>[]; }; submitButton: { loading: ButtonContentData; default: ButtonContentData; }; footerMessage?: FooterMessageData; }