GenericForm

Componente principal de la librería. Genera formularios dinámicos a partir de un array de controles, maneja validaciones con Yup/Formik, y puede conectarse a un backend automáticamente o recibir una función de submit personalizada.

Uso básico

import { GenericForm } from "generic-form";

<GenericForm
  name="usuario"
  endpointPath="/api/usuarios"
  controls={[
    {
      type: "text",
      name: "nombre",
      label: "Nombre",
      gridValues: { xs: 12, sm: 6 },
      validations: { required: true },
    },
    {
      type: "number",
      name: "edad",
      label: "Edad",
      format: "units",
      gridValues: { xs: 12, sm: 6 },
    },
  ]}
/>;

Props de GenericForm

Requeridas

PropTipoDescripción
namestringIdentificador del formulario. Se usa internamente para el submit.
endpointPathstringRuta del endpoint REST. Se usa si no se provee submitFunction.
controlsIGenericControls[]Array de controles del formulario. Ver sección Controls.

Títulos y descripciones

PropTipoDescripción
titlestringTítulo general del formulario.
editTitlestringTítulo en modo edición.
createTitlestringTítulo en modo creación.
descriptionstringDescripción general.
descriptionOnCreatestringDescripción en modo creación.
descriptionOnEditstringDescripción en modo edición.
showSpecificDescriptionbooleanHabilita descripciones distintas para crear y editar.

Comportamiento

PropTipoDescripción
idForEditstring | number | nullID del registro a editar. Si se provee, el formulario entra en modo edición.
connectionMode"multiple" | "unified" | "grouped" | "onDemand"Modo de conexión al backend para cargar datasources.
modalType"xs" | "sm" | "md" | "lg" | "xl" | "fullWith"Si se provee, el formulario se renderiza dentro de un modal del tamaño indicado.
hideButtonsbooleanOculta los botones de acción.
saveOnDirtybooleanHabilita el guardado automático cuando hay cambios.

Funciones personalizadas

PropTipoDescripción
submitFunction(values, name, idForEdit, event) => voidReemplaza el submit por defecto.
getByIdFunction(idForEdit) => anyReemplaza la llamada GET para cargar datos en modo edición.
setIdFunction(idForEdit) => voidActualiza el ID externo al cerrar el modal.
notifyValidation(values?) => Promise<string | void> | string | voidValidación personalizada antes del submit. Si retorna un string, se muestra como warning.

Botones de navegación

PropTipoDescripción
applyButtonbooleanMuestra u oculta el botón "Aplicar". Visible por defecto en modo creación.
nextButton{ text: string, action: (values?) => void, submitOnAction?: boolean }Botón "Siguiente".
prevButton{ text: string, action: (values?) => void, submitOnAction?: boolean }Botón "Anterior".
dataAction{ label: string, action: (values) => void }[]Botones de acción adicionales.

Control de estado de botones

PropTipoDescripción
acceptDisabledFunction(values?) => booleanDeshabilita el botón "Aceptar".
applyDisabledFunction(values?) => booleanDeshabilita el botón "Aplicar".
submitDisabledFunction(values?) => booleanDeshabilita ambos botones de submit.
nextDisabledFunction(values?) => booleanDeshabilita el botón "Siguiente".
prevDisabledFunction(values?) => booleanDeshabilita el botón "Anterior".

Estilos

PropTipoDescripción
sxSxPropsEstilos del contenedor del contenido (DialogContent).
gridContainerSxSxPropsEstilos del Grid container que envuelve los controles.

Controls

El prop controls acepta un array donde cada objeto define un control. Todos comparten props comunes, y cada tipo agrega las suyas.

Props comunes (ICommonProps)

Todos los controles heredan estas props:

PropTipoDescripción
namestringNombre del campo en Formik. Debe ser único dentro del formulario.
labelstringEtiqueta visible del campo.
idstringID del elemento HTML. Por defecto usa name.
placeholderstringTexto de placeholder.
sxSxPropsEstilos del control.
gridValuesIGridValuesTamaño del campo en el grid. Ver IGridValues.
gridSxSxPropsEstilos del Grid item que envuelve el control.
disabled(values?, refs?) => booleanDeshabilita el campo según los valores del formulario.
hidden(values?, refs?) => booleanOculta el campo según los valores del formulario.
onChange(event?, refs?) => voidCallback al cambiar el valor del campo.
disabledOnEditbooleanDeshabilita el campo en modo edición.
persistbooleanMantiene el valor aunque el campo esté oculto.

IGridValues

PropTipoDescripción
xs1-12Tamaño en pantallas extra pequeñas.
sm1-12Tamaño en pantallas pequeñas.
md1-12Tamaño en pantallas medianas.
lg1-12Tamaño en pantallas grandes.
xl1-12Tamaño en pantallas extra grandes.

type: "text" — Campo de texto

Hereda IInputProps (extiende ICommonProps con color, fullWidth, focused, defaultValue).

{
  type: 'text',
  name: 'descripcion',
  label: 'Descripción',
  gridValues: { xs: 12 },
  pattern: /^[a-zA-Z\s]*$/,
  multiline: { minRows: 3, maxRows: 6 },
  validations: { required: true, minLength: 5, maxLength: 200 },
}
PropTipoDescripción
patternRegExpBloquea caracteres inválidos al escribir.
multilineboolean | { minRows?, maxRows? }Convierte el campo en textarea.
color"primary" | "secondary" | "success" | "error" | "info" | "warning"Color del campo.
focusedbooleanMantiene el campo enfocado.
defaultValuestringValor por defecto.
validationsITextValidationValidaciones del campo.

type: "number" — Campo numérico

Hereda IInputProps.

{
  type: 'number',
  name: 'precio',
  label: 'Precio',
  format: 'finance',
  prefix: '$',
  decimalScale: 2,
  gridValues: { xs: 12, sm: 6 },
  validations: { required: true, min: 0 },
}
PropTipoDescripción
format"units" | "finance" | "other"Formato de presentación del número.
prefixstringPrefijo visual (ej: $, ).
decimalScalenumberNúmero de decimales permitidos.
fixDecimalSeparatorbooleanFija el separador decimal.
avoidSeparatorbooleanEvita el separador de miles.
negativeValuesbooleanPermite valores negativos.
maskstringMáscara de formato.
validationsINumberValidationValidaciones del campo.

type: "select" — Selector simple

Hereda IOptionsProps (extiende ICommonProps con options, defaultValue, url, group).

{
  type: 'select',
  name: 'categoria',
  label: 'Categoría',
  gridValues: { xs: 12, sm: 6 },
  options: [
    { label: 'Opción A', value: 'a' },
    { label: 'Opción B', value: 'b' },
  ],
  validations: { required: true },
}
PropTipoDescripción
optionsany[]Array de opciones.
urlstringURL para cargar opciones desde el backend.
groupbooleanAgrupa las opciones.
defaultValuestring | string[]Valor por defecto.
checkValuesany[]Valores a resaltar.
showDeletebooleanMuestra botón para limpiar la selección.
validationsISelectValidationValidaciones del campo.

type: "multiselect" — Selector múltiple

Mismas props que select sin showDelete, con soporte para selección múltiple.

{
  type: 'multiselect',
  name: 'categorias',
  label: 'Categorías',
  gridValues: { xs: 12 },
  options: [
    { label: 'Opción A', value: 'a' },
    { label: 'Opción B', value: 'b' },
  ],
}

type: "autocomplete" — Autocomplete

Hereda IOptionsProps.

{
  type: 'autocomplete',
  name: 'pais',
  label: 'País',
  gridValues: { xs: 12, sm: 6 },
  options: [
    { label: 'Cuba', value: 'cu' },
    { label: 'España', value: 'es' },
  ],
  loadingText: 'Cargando...',
}
PropTipoDescripción
loadingTextstringTexto mientras cargan las opciones.

type: "date" — Selector de fecha

Hereda ITimeControls (extiende ICommonProps con disableFuture, disablePast, maxDate, minDate, defaultValue).

{
  type: 'date',
  name: 'fechaNacimiento',
  label: 'Fecha de nacimiento',
  gridValues: { xs: 12, sm: 6 },
  disableFuture: true,
  validations: { required: true },
}
PropTipoDescripción
disableFuturebooleanDeshabilita fechas futuras.
disablePastbooleanDeshabilita fechas pasadas.
maxDatestringFecha máxima seleccionable.
minDatestringFecha mínima seleccionable.
defaultValuestringFecha por defecto.

type: "time" — Selector de hora

Mismas props que date.

{
  type: 'time',
  name: 'horaInicio',
  label: 'Hora de inicio',
  gridValues: { xs: 12, sm: 6 },
}

type: "radio" — Radio buttons

Hereda ICommonProps.

{
  type: 'radio',
  name: 'genero',
  label: 'Género',
  direction: 'row',
  radios: [
    { denominacion: 'Masculino', idconcepto: 'M' },
    { denominacion: 'Femenino', idconcepto: 'F' },
  ],
  gridValues: { xs: 12 },
}
PropTipoDescripción
radios{ denominacion: string, idconcepto: string }[]Opciones del radio group.
direction"row" | "col"Dirección del grupo.
labelPlacement"top" | "start" | "bottom" | "end"Posición del label.
defaultValuestringValor seleccionado por defecto.
urlstringURL para cargar opciones.

type: "check" — Checkbox

Hereda IChecks (extiende ICommonProps con labelPlacement, color, defaultValue) e ICustomIcons.

{
  type: 'check',
  name: 'activo',
  label: 'Activo',
  defaultValue: true,
  gridValues: { xs: 12, sm: 6 },
}
PropTipoDescripción
defaultValuebooleanValor por defecto.
colorstringColor del checkbox (hex o nombre de color MUI).
labelPlacement"top" | "start" | "bottom" | "end"Posición del label.
customIcons{ outlinedIcon, filledIcon }Íconos personalizados de MUI Icons.

type: "switch" — Switch

Hereda IChecks. Mismas props que check sin customIcons.

{
  type: 'switch',
  name: 'habilitado',
  label: 'Habilitado',
  defaultValue: false,
  gridValues: { xs: 12, sm: 6 },
}

type: "slider" — Slider

Hereda ICommonProps.

{
  type: 'slider',
  name: 'porcentaje',
  label: 'Porcentaje',
  min: 0,
  max: 100,
  defaultValue: 50,
  gridValues: { xs: 12 },
}
PropTipoDescripción
minnumber✅ Valor mínimo.
maxnumber✅ Valor máximo.
defaultValuenumberValor inicial.
stepnumberIncremento del slider.
markbooleanMuestra marcas en el slider.
startIconIconNamesÍcono al inicio del slider (nombre de MUI Icons).
endIconIconNamesÍcono al final del slider.
valueLabelDisplay"auto" | "on" | "off"Cuándo mostrar el valor.

type: "rating" — Rating

Hereda ICommonProps e ICustomIcons.

{
  type: 'rating',
  name: 'puntuacion',
  label: 'Puntuación',
  max: 5,
  defaultValue: 3,
  color: 'yellow',
  gridValues: { xs: 12, sm: 6 },
}
PropTipoDescripción
maxnumberNúmero máximo de estrellas.
defaultValuenumberValor inicial.
precisionbooleanPermite medias estrellas.
colorIconColorColor de las estrellas (nombre de color MUI).
customIcons{ outlinedIcon, filledIcon }Íconos personalizados.

type: "scanner" — Escáner QR

Hereda ICommonProps.

{
  type: 'scanner',
  name: 'codigo',
  label: 'Escanear código',
  parseFunction: (result) => ({ codigo: result.text }),
  closeOnScan: true,
  gridValues: { xs: 12 },
}
PropTipoDescripción
parseFunction(result) => Record<string, any>✅ Transforma el resultado del scan en valores para el formulario.
closeOnScanboolean✅ Cierra el scanner automáticamente al escanear.

type: "component" — Componente personalizado

Permite inyectar cualquier componente React con acceso al contexto de Formik.

{
  type: 'component',
  name: 'custom',
  label: '',
  gridValues: { xs: 12 },
  component: ({ values, setFieldValue, error }) => (
    <div>
      <p>Valor actual: {values.custom}</p>
      {error && <span style={{ color: 'red' }}>{error}</span>}
      <button onClick={() => setFieldValue('custom', 'nuevo valor')}>
        Cambiar
      </button>
    </div>
  ),
}
Prop recibidoTipoDescripción
valuesanyValores actuales del formulario.
setFieldValue(name, value) => voidActualiza el valor de un campo.
setFieldTouched(name) => voidMarca un campo como tocado.
formValueanyValor actual del campo.
erroranyError de validación del campo.
initialValueanyValor inicial del campo.
gridValuesIGridValuesTamaño en el grid.
disabledanyFunción de deshabilitado.
hiddenanyFunción de ocultado.

Ejemplo completo

import { GenericForm } from "generic-form";

export const FormularioUsuario = ({ idForEdit, onClose }) => (
  <GenericForm
    name="usuario"
    title="Nuevo usuario"
    editTitle="Editar usuario"
    endpointPath="/api/usuarios"
    idForEdit={idForEdit}
    setIdFunction={onClose}
    controls={[
      {
        type: "text",
        name: "nombre",
        label: "Nombre",
        gridValues: { xs: 12, sm: 6 },
        validations: { required: true },
      },
      {
        type: "text",
        name: "apellido",
        label: "Apellido",
        gridValues: { xs: 12, sm: 6 },
        validations: { required: true },
      },
      {
        type: "select",
        name: "rol",
        label: "Rol",
        gridValues: { xs: 12, sm: 6 },
        options: [
          { label: "Admin", value: "admin" },
          { label: "Usuario", value: "user" },
        ],
        validations: { required: true },
      },
      {
        type: "number",
        name: "edad",
        label: "Edad",
        format: "units",
        gridValues: { xs: 12, sm: 6 },
        validations: { required: true, min: 18 },
      },
      {
        type: "date",
        name: "fechaIngreso",
        label: "Fecha de ingreso",
        gridValues: { xs: 12, sm: 6 },
        disableFuture: true,
      },
      {
        type: "check",
        name: "activo",
        label: "Activo",
        gridValues: { xs: 12, sm: 6 },
        defaultValue: true,
      },
    ]}
  />
);