/v1.0

ActionModal

ActionModal actúa como enrutador de modales. Dado un actionName, delega el renderizado al modal especializado correcto (FormModal, MultiSelectModal, RelatedRecordsModal, ExportManyModal, ImportManyModal o ImportOneModal). Todos los props adicionales se reenvían al modal seleccionado.

Props

Props base (siempre requeridos)

| Prop | Tipo | Requerido | Por defecto | Descripción | |------|------|-----------|-------------|-------------| | isOpen | boolean | Sí | — | Controla si el modal está visible. | | onClose | (reason?: any) => void | Sí | — | Se llama cuando el modal se cierra. | | title | string | Sí | — | Título pasado al modal renderizado. | | actionName | string | Sí | — | Determina qué modal renderizar. Ver valores soportados abajo. | | backdropStyle | React.CSSProperties | No | — | Estilos para el backdrop del modal. | | windowStyle | React.CSSProperties | No | — | Estilos para la ventana del modal. | | closeButtonStyle | React.CSSProperties | No | — | Estilos para el botón de cierre. | | closeIcon | string | No | — | Nombre del ícono del botón de cierre. | | closeIconPaths | any[] | No | — | Rutas de ícono personalizadas para el botón de cierre. | | closeIconSize | number | No | — | Tamaño del ícono del botón de cierre. | | zIndex | number | No | — | z-index CSS del overlay. | | id | string | No | — | id HTML del elemento modal. | | subtitle | string | No | — | Subtítulo pasado al modal renderizado. | | fullScreen | boolean | No | — | Cuando es true, el modal ocupa toda la pantalla. | | data | any | No | — | Datos pasados al modal renderizado. | | apiBaseUrl | string | No | — | URL base del cliente HTTP. |

actionName: "openFormModal" — props adicionales

| Prop | Tipo | Requerido | Por defecto | Descripción | |------|------|-----------|-------------|-------------| | formTitle | string | No | — | Título mostrado dentro del formulario. | | formWidth | number | No | — | Ancho máximo del panel del formulario. | | formMode | "create" \| "edit" \| "globalEdit" \| "readOnly" \| "submit" | No | — | Modo del formulario. | | fields | any[] | No | — | Definiciones de campos del formulario. | | savePath | string | No | — | Ruta de API para hacer POST de los datos del formulario. | | fetchPath | string | No | — | Ruta de API para precargar datos del formulario. | | onSuccess | (data: any) => void | No | — | Se llama cuando el envío es exitoso. | | useAuthToken | boolean | No | — | Usar el cliente HTTP autenticado. |

actionName: "openMultiSelectModal" — props adicionales

| Prop | Tipo | Requerido | Por defecto | Descripción | |------|------|-----------|-------------|-------------| | searchPath | string | No | — | Ruta de API para la búsqueda por autocompletado. | | searchPlaceholder | string | No | — | Placeholder para el campo de búsqueda. | | searchItemLabelKey | string | No | — | Clave usada como etiqueta del ítem en resultados. | | searchItemDescriptionKey | string | No | — | Clave usada como descripción del ítem en resultados. | | searchItemImageKey | string | No | — | Clave usada como imagen del ítem en resultados. | | startSlots | any | No | — | Slots al inicio de cada ítem de la lista. | | endSlots | any | No | — | Slots al final de cada ítem de la lista. | | savePath | string | No | — | Ruta de API para guardar la selección. | | useAuthToken | boolean | No | — | Usar el cliente HTTP autenticado. | | noContentText | string | No | — | Texto de estado vacío. | | noContentIcon | string | No | — | Ícono de estado vacío. |

actionName: "openRelatedRecordsModal" — props adicionales

| Prop | Tipo | Requerido | Por defecto | Descripción | |------|------|-----------|-------------|-------------| | startSlots | any | No | — | Slots al inicio de cada ítem de la lista. | | endSlots | any | No | — | Slots al final de cada ítem de la lista. | | noContentText | string | No | — | Texto de estado vacío. | | noContentIcon | string | No | — | Ícono de estado vacío. |

actionName: "openExportManyModal" — props adicionales

| Prop | Tipo | Requerido | Por defecto | Descripción | |------|------|-----------|-------------|-------------| | exportPath | string | Sí | — | Ruta de API para la exportación. | | columns | { label: string; value: string }[] | Sí | — | Definiciones de columnas a exportar. | | format | "excel" \| "pdf" \| "json" | Sí | — | Formato de exportación. |

actionName: "openImportManyModal" — props adicionales

| Prop | Tipo | Requerido | Por defecto | Descripción | |------|------|-----------|-------------|-------------| | importPath | string | Sí | — | Ruta de API para la importación. | | acceptFileTypes | string[] | Sí | — | Extensiones de archivo aceptadas (ej. ["xlsx", "csv"]). |

actionName: "openImportOneModal" — props adicionales

| Prop | Tipo | Requerido | Por defecto | Descripción | |------|------|-----------|-------------|-------------| | importPath | string | Sí | — | Ruta de API para la importación. | | useAuthToken | boolean | No | — | Usar el cliente HTTP autenticado. |

Uso

Básico

import React from 'react';
import ActionModal from '@/components/modals/ActionModal';

export default function Example() {
  const [open, setOpen] = React.useState(false);

  return (
    <>
      <button onClick={() => setOpen(true)}>Open</button>
      <ActionModal
        isOpen={open}
        onClose={() => setOpen(false)}
        title="Add Members"
        actionName="openMultiSelectModal"
        searchPath="/v1/users/search"
        searchItemLabelKey="name"
        savePath="/v1/team/members"
        useAuthToken
      />
    </>
  );
}